5

私は Ruby on Rails を初めて使用し、現在http://ruby.railstutorial.orgを実行しています。

私が理解していることから、言語はこの DRY 標準に厳密に従う必要がありますが、このチュートリアルでのテスト駆動開発に関しては非常にウェットです。

例えば

it { should have_link('Users', href: users_path) }
it { should have_link('Profile', href: user_path(user)) }
it { should have_link('Settings', href: edit_user_path(user)) }
it { should have_link('Sign out', href: signout_path) }

ここには、ほとんど同じように見える行がたくさんあります。

私たちはこれを試しました

it "should have following links from this array" do
    [
        ['Users', href: users_path],
        ['Profile', href: user_path(user)],
        ['Settings', href: edit_user_path(user)],
        ['Sign out', href: signout_path]
    ].each { |a| page.should have_link(a[0], a[1]) }
end

このコードは機能しますが、見栄えが悪く、行が増えています。

したがって、配列を have_link メソッドに追加する方が良い方法かどうかを知りたいです。


私は今、素晴らしいアイデアを持っていますが、それを機能させる方法がわかりません。

これは私のヘルパーです (この質問を作成したときのようには見えません。Michaël Witrant からの回答後に編集されています)。

RSpec::Matchers.define :have_these_links do |*links|
    match do |actual|
        links.each do |link|
            have_link(link.first, link.extract_options!).matches?(actual)
        end
    end
end

これが私のテストになるはずです

it { should have_these_links(['Users', href: users_path],
                        ['Profile', href: user_path(user)],
                        ['Settings', href: edit_user_path(user)],
                        ['Sign out', href: signout_path]) }

これは機能しますが、ユーザーフレンドリーではありません。テストを実行し、ページにリンクが存在しない場合、これらのリンクがないことがわかります。しかし、どのリンクが不足しているかをヘルパーに教えてもらうことができます。これは私のエラーコードです

   expected #<Capybara::Session> to have these links ["Users", {:href=>"/users"}], ["Test Link", {:href=>"/Does_not_exist"}], and ["Profile", {:href=>"/users/991"}]
 # ./spec/requests/authentication_pages_spec.rb:42:in `block (4 levels) in <top (required)>'
4

2 に答える 2

7

カスタムマッチャーを書くことはできますが、それはテストと DRY の考え方ではないと思います。

コードでは、DRY マントラにより、ソフトウェアに関するすべての知識を一意で明確な場所に保持することが奨励されます。それは仕様の目標ではありません。仕様の目標は、ソフトウェアの正確性を明示的かつ読みやすい方法でだますことです。

繰り返す

it { should have_link('Users', href: users_path) }

[text, url] の宣言と配列よりもはるかに読みやすく読みやすく、何らかのカスタムマッチャー内であっても、それらを反復処理します。

テストでは、簡潔さよりも読みやすさを優先する必要があります。

于 2012-08-12T11:41:48.617 に答える
4

カスタムマッチャーを定義するには、この機能インスピレーションを読むことができます。

そして、そのようなものを書きます:

RSpec::Matchers.define :have_links do |expected|
  match do |actual|
    expected.all? do |name, options|
      have_link(name, options).matches?(actual)
    end
  end
end

しかし、IMO、あなたの最初の試みはそれを書くための最良の方法です: きれいで読みやすい.

于 2012-08-11T22:48:49.750 に答える