IntegrationTest Ruby on Rails中的assert_select

时间:2018-12-16 05:02:09

标签: ruby-on-rails ruby assertion

我来自Python和Java背景,仅具有CSS,HTML,Ruby的基础知识,并尝试使用Ruby on Rails学习Web开发。我正在尝试遵循Michael Hartl上的教程。我经常在阅读正确的API或什至了解API在做什么时遇到问题,因为似乎有很多方法可以调用某种方法,并且在那里没有详尽地显示示例。特别是,我不明白清单7.25中的assert_select方法在做什么参数。

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest

  test "invalid signup information" do
    get signup_path
    assert_no_difference 'User.count' do
      post users_path, params: { user: { name:  "",
                                         email: "user@invalid",
                                         password:              "foo",
                                         password_confirmation: "bar" } }
    end
    assert_template 'users/new'
    assert_select 'div#<CSS id for error explanation>'
    assert_select 'div.<CSS class for field with error>'
  end
  .
  .
  .
end

通过参考Online APIs,如果一个人使用不带代码块的assert_select,我们将使用2个参数。但是,在两个示例中,每个示例中只有#.中只有1个,对于这是Rails / Ruby / CSS语法(语法的起源),我不太熟悉似乎很复杂。

有人可以启发我,我在这里错过了什么?我不太熟悉何时使用#和何时使用.,以及如何“缩短”参数的数量。像_这样的标点似乎总是有很多作用,这里没有显示。

1 个答案:

答案 0 :(得分:0)

assert_select可以是called several different ways,包括CSS选择器,例如您问题中的代码。

CSS selectors可以包含#.符号。这就是他们的意思:

  • #引用了HTML元素ID
  • .引用CSS类

ID在文档中必须唯一。因此,div#error会找到以下确切元素:<div id="error">Some error text</div>

另一方面,类可以在整个HTML文档中重复使用。因此,div.error将找到所有类似这样的元素:<div class="error">Some error text</div>

最后,在Ruby中还使用了#.来区分类和实例方法。 .表示类方法。 #表示实例方法。但是,这不是assert_select方法中发生的事情。