RSpecを使用してJSONレスポンスを確認する方法は?
私のコントローラーには以下のコードがあります:
format.json { render :json => {
:flashcard => @flashcard,
:lesson => @lesson,
:success => true
}
RSpecのコントローラテストでは、あるシナリオが成功のjsonレスポンスを受け取ることを確認したいので、次のような行を用意しました:
controller.should_receive(:render).with(hash_including(:success => true))
しかし、テストを実行すると、次のようなエラーが発生します:
Failure/Error: controller.should_receive(:render).with(hash_including(:success => false))
(#<AnnoController:0x00000002de0560>).render(hash_including(:success=>false))
expected: 1 time
received: 0 times
レスポンスの確認が間違っているのでしょうか?
142
11
レスポンスオブジェクトを調べ、期待値が含まれていることを確認することができます:
EDIT
これを
post
に変えると、少し厄介なことになります。以下はその処理方法です:なお、
mock_model
はto_json
に反応しないので、stub_model
か本物のモデルインスタンスが必要です。このようにレスポンスボディを解析することができます:
そして、その解析された内容に対して、アサーションを行うことができるのです。
ケビントローブリッジの答えの構築。
また、json_spec gemもあり、これは一見の価値があります。
https://github.com/collectiveidea/json_spec
これを行うためのシンプルで簡単な方法。
spec / support /
内でヘルパー関数を定義することもできます。JSON応答にアクセスする必要がある場合は常に「json_body」を使用します。
たとえば、リクエストスペックの内部では、直接使用できます。
JSON応答のみをテストするもう1つのアプローチ(内部のコンテンツに期待値が含まれているわけではありません)は、ActiveSupportを使用して応答を解析することです。
応答が解析可能なJSONでない場合、例外がスローされ、テストは失敗します。
「コンテンツタイプ」ヘッダーを調べて、それが正しいことを確認できます?
Rails 5(現在はベータ版)を使用する場合、テスト応答に「parsed_body」という新しいメソッドがあり、最後のリクエストがエンコードされたものとして解析された応答を返します。
GitHubのコミット:https://github.com/rails/rails/commit/eee3534b。
Rspecが提供するハッシュdiffを利用したい場合は、体を解析してハッシュと比較することをお勧めします。 私が見つけた最も簡単な方法:
ここでカスタマーマッチャーを見つけました:https://raw.github.com/gist/917903/92d7101f643e07896659f84609c117c4c279dfad/have_content_type.rb。
spec / support / matchers / have_content_type.rbに入れ、spec / spec_helper.rbでこのようなものをサポートからロードするようにしてください。
指定されたリンクから消えた場合に備えて、コード自体を次に示します。