RSPEC中的存根JSON.parse

时间:2019-03-08 01:23:48

标签: ruby-on-rails ruby rspec rspec-rails

我正在这里进行一些RSPEC测试。

如果我有此方法:

JSON.parse("https://test.com/return_json/reviews.json")

然后我可以像这样对它进行存根(RSPEC)

test_reviews = {"reviews" => [{"data1" => "1", "data2"=> "2"}]}
allow(JSON).to receive(:parse).and_return(test_reviews.to_json)

但是对于这种类型((to_uriread内部有其他方法)。

JSON.parse("https://test.com/return_json/reviews.json".to_uri.read)

我尝试使用receive_message_chain,但没有成功。

预先感谢大家!

1 个答案:

答案 0 :(得分:1)

您的代码实际上并未调用您的网址。您需要进行http调用并解析正文。我应该看起来像这样。

describe :ReviewsController
  let(:uri) { URI('https://test.com/return_json/reviews.json') }
  let(:reviews) { {"reviews" => [{"data1" => "1", "data2"=> "2"}]} }

  before do 
    stub_request(:get, uri).
      with(headers: {'Accept'=>'*/*', 'User-Agent'=>'Ruby'}).
      to_return(status: 200, body: JSON.dump(reviews), headers: {})
  end

  it 'does whatever you want' do
    response = Net::HTTP.get(uri)
    expect(JSON.parse(response.body)['data1']).to eq('1') # or whatever you want to test
  end
end

here更好地解释了。