web-dev-qa-db-ja.com

適切なエラーメッセージでカピバラを使用して要素の数をアサートする方法は?

カピバラでは、次のようなことができることを知っています。

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

ただし、ページに一致する要素が1つしかない場合、エラーはあまり説明的ではありません。

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

このかなりあいまいなエラーメッセージの代わりに、エラー出力が「 'ol li'に一致するとき:予想:2、見つかった:1」などのような方法でアサーションを記述する方法があります。明らかに、このような動作のために自分でカスタムロジックを作成することができます。

それが価値があるものとして、私はSeleniumドライバーとRSpecを使用しています。

80
merryprankster

私はこれがずっと好きです。

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

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

169
pandaPowder

すぐに使用できるサポートはないように見えるので、このカスタムマッチャーを作成しました。

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

それは今のところトリックをします、私はカピバラのこの部分を作ることを検討します。

22
merryprankster

次の方が簡単で、かなり明確な出力が得られ、カスタムマッチャーの必要がなくなると思います。

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

これはエラー時に出力されます:

      expected: 2
       got: 3

  (compared using eql?)
  (RSpec::Expectations::ExpectationNotMetError)
14
Richard

編集: @ThomasWalpoleが指摘したように、allを使用すると、Capybaraの待機/再試行が無効になるため、@ pandaPowerによる上記の回答の方がはるかに優れています。

これはどう?

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

カピバラが推奨する現在の(2013年9月2日)ベストプラクティスは次のとおりです( source ):

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

3
acconrad