CapybaraHaveSelector
は RSpecexpect
で期待どおりに動作しません。私は Capybara と RSpec を初めて使用するので、これは RSpec または Capybara に関する私の誤解であるか、または Capybara (バージョン 2.0.2) の欠陥である可能性があります。私の間違いを理解するか、バグレポート/機能リクエストを作成するのを手伝ってください.
私のRSpecで私は書いた:
expect { click('.special-div .submit') }.to have_css('.submitted')
これは機能的に同等であると予想していました
click('.special-div .submit')
page.should have_css('.submitted')
そうではありません。代わりに、マッチャーhave_css
は、proc オブジェクトを呼び出した結果ではなく、proc オブジェクトの文字列変換に対して照合を試みます。(つまり、click('.special-div .submit')
決して実行されません。)
カピバラの振る舞いは次のとおりです。
- かなり合理的
- Capybara に欠けている機能の例
- カピバラ 2.0.2 のバグ
- 他の何か?
expect {}
また、上記の 2 行バージョンを使用することで明らかにやりたいことを実行できますが、私たちのチームは で標準化しようとしexpect {}
ています。
編集
私は作業中のコードを継承したので、Andrey Botalov が指摘したように、それclick
が Capybara の標準部分ではないことに気づきませんでした。そうあるべきだと思われますが、これもclick
すでに他の用途で多用されているため、Capybara がさらに別の定義を追加しない方がよい場合があります。
一部の人々は懐疑的であるように見えるので、このコードが正常に機能していることを保証させてください:
click('.special-div .submit')
page.should have_css('.submitted')
について疑問に思っている人にとってhave_css()
は、これが の RSpec マジックですhas_css?
。について疑問に思っている人のためclick
に、私のプロジェクトでは、誰かが次のように便利にclick
関数を作成しました:
def click(css)
page.execute_script("$('#{css}').first().trigger('click');")
end
なんで?明らかな代替手段がどれも機能しなかったためです。
click_on('.special-div .submit') # Fails because click_on does not take CSS
# Cannot use click_button() because we are clicking on a <div>
find('.special-div .submit').click # Raises exception because there are more than one
first('.special-div .submit').click # Fails because the div is not visible
続けて、@zetetic が尋ねた
expect(click('.special-div .submit')).to have_css('.submitted')
動作します。いいえ、私たちはまだ RSpec 2.9 を使用しており、その構文は 2.11 で導入されたので機能しませんが、アップグレードしてもclick
オブジェクトを返さないため機能しません。click
2.11 にアップグレードして returnに変更すればおそらく動作するでしょうpage
。