web-dev-qa-db-ja.com

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

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

response.should render_template('index')のような応答オブジェクトに対する他の期待は問題なく通過します。

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

バージョンに関しては、Rails 2.1.0、RSpec 1.2.7。

96
Toms Mikoss

デフォルトでは、rspec-Railsは、Rails to)preventにハッキングします。実際にビューテンプレートをレンダリングすることはできません。テンプレートレンダリングの結果ではなく、アクションの動作とコントローラーテストをフィルター処理します。これがビュー仕様の目的です。

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

describe YourController do
  render_views
  ...
end
181
mislav

RSpec 2+:エンドツーエンドをチェックする場合-応答本文へのURL- controller spec の代わりに request spec を使用します。

3
Thomas

同様の問題(この質問につながった)を扱ったときに、同じ猫の皮を剥ぐ方法が異なることがわかりました。つまり、本文を確認するのではなく、フラッシュの内容を確認できる場合があります。

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

以下と同等のチェックかもしれません:

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

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

乾杯、

ジョン

2
John Lockwood

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

これを修正する方法の1つは、render_views設定Rails_helper.rbファイル。このようにして、すべてのテストでグローバルに動作できるようにします。

RSpec.configure do |config|
  config.render_views
end

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

describe User do
  render_views
end

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

1
Nesha Zoric