【问题标题】:Capybara: How To Assert A Given Number of Elements ExistCapybara:如何断言给定数量的元素存在
【发布时间】:2013-06-08 20:03:18
【问题描述】:

我已将我的整个堆栈从基于 Rails 3.0 的项目升级到 3.1。我的规格通过了,但我的功能现在有点挑剔。我目前遇到的问题是这一步:

Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector|
  page.find(:css, selector, :count => count.to_i)
end

在功能本身,我可能会说:

Then I should see 5 menu items within "tr#menu_item_row"

我得到的信息是:

Then I should see 5 menu items within "tr#menu_item_row"                                      # features/step_definitions/admin_menu_steps.rb:1
  Ambiguous match, found 5 elements matching css "tr#menu_item_row" (Capybara::Ambiguous)
  ./features/step_definitions/admin_menu_steps.rb:2:in `/^I should see (\d+) menu item(?:s)? within "([^"]*)"$/'
  features/admin_menu.feature:30:in `Then I should see 5 menu items within "tr#menu_item_row"'

据我所知,这 5 个元素与实际找到的 5 个元素相匹配。是我写错了这段代码还是发生了重大变化?谢谢!

【问题讨论】:

    标签: ruby-on-rails testing cucumber capybara integration-testing


    【解决方案1】:

    如果您想检查 5 个元素,则默认情况下不应使用 #find,因为 Capybara 2.0 此方法总是在发现多于或少于一个元素时抛出异常。这是一个有意的(我相信)一个很好的改变。

    要断言存在 5 个元素,适当的方法是 rspec 匹配器:

    expect(page).to have_css(selector, count: count.to_i)
    

    我不推荐 @fontno 推荐的 to set match to prefer_exact,因为在大多数情况下,如果 find 找到多个元素,您希望 Capybara 抛出异常。

    【讨论】:

      【解决方案2】:

      是的,这是 1.x 和 2.x 版本之间的变化。您可以查看capybara upgrade guide 和此blog post 中的所有更改。

      如果找到多个元素,find 方法现在会引发 ambiguous match 错误。如果你只有几个例子,你可以做这样的事情

      Then /^I should see (\d+) menu item(?:s)? within "([^"]*)"$/ do |count, selector|
        page.find(:css, selector, :count => count.to_i, match: prefer_exact)
      end
      

      或者如果你有很多这样的例子,你可以改变 capybara 的配置以实现向后兼容,像这样

      Capybara.configure do |config|
        config.match = :prefer_exact
        config.ignore_hidden_elements = false
      end
      

      您可能需要对其进行修改才能使其正常工作,但这是一般的想法。请参阅我上面提到的链接,它都在那里。希望这能让你朝着正确的方向前进

      【讨论】:

      • :prefer_exact 可以被认为是一种不好的做法,正如您在链接到的博客文章中看到的那样,并在 Capybara 2.1 中添加,因为很多人说他们需要它来向后兼容他们编写的代码对于 1.x。我认为建议使用它是个坏主意。
      • 所以因为我引用并链接到我应该投反对票的文章?我只是告诉提问者为什么会发生这种情况以及可以做些什么。我没有告诉提问者他们不应该更新该功能,只能这样做。只是指出问题是“有什么变化吗?”
      • 赞成,因为它实际上将我的注意力集中在 match 设置之间的差异上。
      猜你喜欢
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      相关资源
      最近更新 更多