如何使用正确的错误信息使用水豚断言元素的数量?
我知道在水豚,你可以做这样的事情:
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)
那么,现在似乎没有支持,我写了这个自定义匹配器:
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)