1. ホーム
  2. ruby-on-rails

[解決済み] RSpecを使用してJSONの応答を確認する方法は?

2022-04-26 03:36:34

質問

コントローラ内に以下のようなコードがあります。

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

レスポンスの確認方法が間違っているのでしょうか?

解決方法は?

レスポンスオブジェクトを調べ、期待される値が含まれているかどうかを確認することができます。

@expected = { 
        :flashcard  => @flashcard,
        :lesson     => @lesson,
        :success    => true
}.to_json
get :action # replace with action name / params as necessary
response.body.should == @expected

EDIT

に変更すると post は少し厄介になります。ここでは、その対処法を紹介します。

 it "responds with JSON" do
    my_model = stub_model(MyModel,:save=>true)
    MyModel.stub(:new).with({'these' => 'params'}) { my_model }
    post :create, :my_model => {'these' => 'params'}, :format => :json
    response.body.should == my_model.to_json
  end

なお mock_model には反応しません。 to_json ということで、どちらか stub_model または実際のモデルインスタンスが必要です。