RSpecコントローラーテスト-空のresponse.body


103

RSpecでコントローラーをテストすると問題が発生します。response.body呼び出しは常に空の文字列を返します。ブラウザーではすべてが正しくレンダリングされ、キュウリの機能テストでは正しく表示されるようですが、RSpecは毎回失敗します。

response.should render_template('index')問題なく合格するなど、応答オブジェクトに対するその他の期待。

以前にこの問題に遭遇したことがありますか?おそらく、応答htmlは他の方法で取得できますか?

バージョンについては、Rails 2.1.0、RSpec 1.2.7。

回答:


193

デフォルトでは、rspec-railsはRailsにハッキングして、実際にビューテンプレートをレンダリングしないようにします。アクションの動作とコントローラーテストのフィルターのみをテストする必要があります。テンプレートレンダリングの結果ではなく、それがビュースペックの目的です。

ただし、アプリが通常行うようにコントローラー仕様をテンプレートにレンダリングする場合は、render_viewsディレクティブを使用します。

describe YourController do
  render_views
  ...
end

2
本当に私に必要なものをありがとう。
トムズミコス2009

2
私は何年もRailsを扱ってきましたが、ようやくコントローラー仕様とリクエスト仕様の違いを理解しました。ありがとう!
ブライアンアンダーウッド


2

私が同様の問題を抱えていたので(この質問につながった)、同じ猫の皮をむく方法がいくつかあることに気付きました。つまり、本文を確認するのではなく、フラッシュの内容を確認できる場合があります。

response.body.should =~ /Invalid email or password/

以下と同等のチェックになる可能性があります。

flash[:alert].should == "Invalid email or password"

後者はどちらの方法でも実行できるので、少し柔軟に思えますが、すべての場合に適切であるとは限りません。

乾杯、

ジョン


2

デフォルトでは、RSpec-rails構成はコントローラー仕様のテンプレートのレンダリングを無効にします

これを修正する方法の1つは、ファイルのrender_views設定を必ず有効にすることrails_helper.rbです。このようにして、すべてのテストでグローバルに機能できるようにします。

RSpec.configure do |config|
  config.render_views
end

または、render_views宣言を個々のグループで使用します。

describe User do
  render_views
end

詳細については、こちらをご覧ください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.