これらのうち、統合 (リクエスト) テストを作成する「正しい」方法はどれですか。
it "should be successful" do
get "/about/terms"
response.should be_success
end
it "should be successful" do
get about_terms_path
response.should be_success
end
これらのうち、統合 (リクエスト) テストを作成する「正しい」方法はどれですか。
it "should be successful" do
get "/about/terms"
response.should be_success
end
it "should be successful" do
get about_terms_path
response.should be_success
end
about_terms_path
カスタムルートパスはルートファイルで変更される可能性がありますが、ルートの名前は同じままである必要があるため、これは正しいです。
前者は脆弱なテストにつながります。
ルートの名前が変更された場合、Rails アプリ内のそのルートへのすべての参照を変更する必要があり、rspec テストも変更する必要があります。
ルートのパスが変更された場合、Rails アプリまたは rspec テストの何も変更する必要はありません。
編集:
ルートをテストしたい場合は、これをチェックしてください https://www.relishapp.com/rspec/rspec-rails/docs/routing-specs
どちらでもいいと思いますが、個人的には前者の方が好きです。
統合テストは、人間の目と動作を模倣することです。人間は「/about/terms」を見ることができましたが、「about_term_path」を見ることはできませんでした。
さらに、2つの提案:
JavascriptでWebドライバーを許可するCapybaraを使用することをお勧めします。その場合、「get」は機能せず、代わりに「visit」を使用します
機能テスト(コントローラ)の仕事である統合テストでのレスポンスチェックは不要です。実際のポイントに直接移動します。
追加
ジェイソンの質問に答える。はい、統合テストでは一貫してハードコードされたルートを常に使用しています。
その理由は、Acceptance Tests Driven Development のキーポイントである、 outside-in アプローチにあります。結合テストを書くとき、routes.rb がまだ改訂されていないため、名前付きルートがわかりません。または、知っているはずですが、その時点では気にしません。
rspec が「一致するルートがありません」と言ったとき、私は、コントローラーを生成して、routes.rb をチェックさせてくださいと言いました。