如何使用正确的错误信息使用水豚断言元素的数量?

我知道在水豚,你可以做这样的事情:

page.should have_css("ol li", :count => 2) 

但是,假设页面只有一个匹配的元素,这个错误不是非常具有描述性:

  1) initial page load shows greetings Failure/Error: page.should have_css("ol li", :count => 2) expected css "ol li" to return something 

而不是这个相当晦涩的错误消息,有没有一种方式来写错误输出的错误输出类似'当匹配'李',预期:2,find:1'的断言。 显然,我可以自己做一个自定义的逻辑来处理这样的行为 – 我问有没有办法做到这一点“开箱即用”?

对于它的价值,我使用Selenium驱动程序和RSpec。

我更喜欢这个。

 expect(page).to have_selector('input', count: 12) 

https://github.com/jnicklas/capybara/blob/415e2db70d3b19b46a4d3d0fe62f50400f9d2b61/spec/rspec/matchers_spec.rb

那么,现在似乎没有支持,我写了这个自定义匹配器:

 RSpec::Matchers.define :match_exactly do |expected_match_count, selector| match do |context| matching = context.all(selector) @matched = matching.size @matched == expected_match_count end failure_message_for_should do "expected '#{selector}' to match exactly #{expected_match_count} elements, but matched #{@matched}" end failure_message_for_should_not do "expected '#{selector}' to NOT match exactly #{expected_match_count} elements, but it did" end end 

现在,你可以做这样的事情:

 describe "initial page load", :type => :request do it "has 12 inputs" do visit "/" page.should match_exactly(12, "input") end end 

并得到如下输出:

  1) initial page load has 12 inputs Failure/Error: page.should match_exactly(12, "input") expected 'input' to match exactly 12 elements, but matched 13 

它现在做的伎俩,我会考虑使这部分水豚。

我认为以下更简单,给出相当清晰的输出,并消除了自定义匹配器的需要。

 page.all("ol li").count.should eql(2) 

然后打印出错:

  expected: 2 got: 3 (compared using eql?) (RSpec::Expectations::ExpectationNotMetError) 

这个怎么样?

  within('ol') do expect( all('.opportunity_title_wrap').count ).to eq(2) end 

目前(9/2/2013)水豚推荐的最佳做法是以下( 来源 ):

page.assert_selector('p#foo', :count => 4)

@pandaPower的答案非常好,但对我来说语法略有不同:

 expect(page).to have_selector('.views-row', :count => 30)