UIで発生することに対応してボタンを有効/無効にするアプリがあります。
カピバラを使用して、ボタンが存在するかどうかを簡単に検出できます
should have_button 'save'
しかし、保存ボタンの状態を確認する方法がわかりません。あれは:
ボタンの存在をチェックするCapybaraアサーションを書くにはどうすればいいですか?andボタンの有効状態または無効状態
無効なボタンのチェックを一緒にハックしました。有効にした場合、一致するボタンがあり、一致する無効なボタンがないことを確認できると思います。しかし、これは控えめに言っても不格好です。
これは基本的なUIチェックのように思えます。何かを見落としていると確信していますが、何がわかるのかわかりません。
集合体の答えに基づいてフォローアップ:
コメントで述べたように、Capybaraの動作は、基盤となるドライバーに依存しています。 Webkitを使用しており、「true」/「false」の文字列結果を返します。どうやら、他のドライバーはtrue/falseを返します。 Capybaraの人々はこの問題(github.com/jnicklas/capybara/issues/705)を認識していますが、(おそらく正しく)解決すべき問題ではないと感じています。
テストを使用しているドライバーに依存するのではなく、カスタムマッチャーを作成することになりました。
RSpec::Matchers.define :be_enabled do
match do |actual|
driver_result = actual[:disabled]
# nil, false, or "false" will all satisfy this matcher
(driver_result.nil? || driver_result == false || driver_result == "false").should be_true
end
end
RSpec::Matchers.define :be_disabled do
match do |actual|
driver_result = actual[:disabled]
(driver_result == "disabled" || driver_result == true || driver_result == "true").should be_true
end
end
次に入力できます:
user_license_area.find_button('Save').should be_disabled
Capybaraの無効化された要素の処理が変更されたように見えるので、更新を行うと思いました。
ページにボタンがあり、有効になっているかどうかをテストするには、次を使用します。
expect(page).to have_button('Save')
ページにボタンがあり、無効になっているかどうかをテストするには、次を使用します。
expect(page).to have_button('Save', disabled: true)
この形式は、has_field?
、find_field
など.
この更新の詳細については、 http://www.elabs.se/tag/capybara をご覧ください。
[〜#〜] update [〜#〜]
古いリンクが壊れています。 これはこの機能が議論されたGitHubの問題です および これは残念ながらメソッドの不毛なドキュメントです です。
find_button('save')[:disabled].should eq "disabled"
1行で、存在状態と無効状態の両方を効果的にテストすることに注意してください。
編集:有効にするには、試してください
find_button('save')[:disabled].should_not be
(これらのテストは、ボタンの無効化/有効化の方法に応じて微調整する必要があります。)
これを行うには多くの方法があります。私は最善の方法はCSSセレクターを使用することだと思います
expect(page).to have_css("#save:enabled")
この例では、css idがsaveに設定されていると想定しています。
Be_disabledチェックがあります
it "allows finding elements and checking if they are disabled" do
expect(string.find('//form/input[@name="bleh"]')).to be_disabled
expect(string.find('//form/input[@name="meh"]')).not_to be_disabled
end
UIでのユーザーのアクション(ドキュメントの種類の選択)がボタンを有効にするトリガーとなる同様の状況から...
コントロールのIDを使用すると、(状態に関係なく)ボタンを見つけて「無効」の状態をアサートするのが非常にきれいになります。
@javascript
Scenario: Package generation not allowed unless a document type is selected
Given I view the "Liberty and 4th Building Renovation" project
When I view the Package Creator
Then both document package generation buttons should be disabled
@javascript
Scenario: Package generation allowed when documents types are selected
Given I view the "Liberty and 4th Building Renovation" project
When I view the Package Creator
And I select any document type
Then both document package generation buttons should be enabled
そして、カピバラでサポートするキュウリ機能のステップ:
Then(/^both document package generation buttons should be disabled$/) do
expect(find_by_id('generate_pdf')).to be_disabled
expect(find_by_id('generate_Zip')).to be_disabled
end
Then(/^both document package generation buttons should be enabled/) do
expect(find_by_id('generate_pdf')).not_to be_disabled
expect(find_by_id('generate_Zip')).not_to be_disabled
end