一尘不染

如何使用RSpec检查JSON响应?

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

我是否检查响应不正确?


阅读 248

收藏
2020-07-27

共1个答案

一尘不染

您可以检查响应对象并验证它是否包含期望值:

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

编辑

将此更改为a 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或真实的模型实例。

2020-07-27