2017-07-21 3 views
0

私はPageObjectパターンを使用しています。このパターンでは、テストのトップレベルからHTMLの詳細を抽象化しています。私はSitePrism gemを使ってこれをやっています。私の例ではCapybaraとSitePrismのどちらのアサーションスタイルですか?

、私がホームページを持っている(HomePage.rb):

共通ページのセクションを参照
class HomePage < SitePrism::Page 
    set_url ENV['BASE_URL'] 
    section :header, HeaderSection, "div[class='headerSection']" 

HeaderSectionHeaderSection.rb) :

class HeaderSection < SitePrism::Section 
    element :sign_in_button, "a[class='signIn']" 

とステップ定義私のテスト(login.rb)のために:

And(/^I am not logged in/) do 
    @home_page = HomePage.new # actually, this is specified in env.rb  
    expect(@home_page.header).to have_sign_in_button 
end 

代わりのステップ定義にウェブ要素を露出させ、私はホームページのクラスメソッド内でこれをカプセル化します。上記

def amILoggedIn 
    expect(header).to have_sign_in_button 
end 

私もinclude RSpec::Matchersを使用していますことを前提としています。それを行うための最善の方法は、ホームページ自体(HomePage.rb)内のクラスメソッドにアサーションを入れているようです。

私の方法は、ステップの定義(login.rb)にさらさ唯一の事のようになります。SitePrismの一環として

And(/^I am not logged in/) do 
    @home_page.amILoggedIn 
end 

sign_in_button要素がに独自のビルトインメソッドを持っていますでその存在について確認してください。

header.has_sign_in_button? 

質問

amILoggedInメソッド内でこの主張を書くの中で最も推奨される方法でのベストプラクティス、(彼らの両方が同じ命令を使用して表示されるにもかかわらず)の面では

expect(header).to have_sign_in_button 

または

header.has_sign_in_button? 
+0

私は、主に意見に基づいている質問を削除しました(しかし、私の意見では、これは良いパターンです)。 –

答えて

1

expect(header).to have_sign_in_buttonheader.has_sign_in_button?は、2つの異なることを行います。最初はアサーションであり(失敗した場合は例外が発生します)、2番目のメソッドはブール型のレスポンスを返します。あなたが望むものがアサーションであれば、ブール応答assert header.has_sign_in_button?またはexpect(header.has_sign_in_button?).to be trueにアサートできますが、have_sign_in_buttonのエラーメッセージはもっと説明的なものになります。

+0

こんにちはトーマス。私自身の個人的な意見では、 'assert'の代わりに、特に未熟なRubyのテストコードに慣れていない人には、' assert'の方が読みやすいので、 'expect'アサーションを自分で好むのです。 – jimjamz

関連する問題