私は 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)>'