Rspec / VCR存根响应在何处以及如何预期?

时间:2016-03-14 23:06:22

标签: ruby rspec vcr

我在ruby中编写客户端以获取我们正在使用的API。我们使用rspec和VCR与webmock模拟对API的请求/响应。

当响应有效负载非常大时,从API测试响应的最佳或适当方法是什么?

是否有最佳实践可以放置大量的预期有效负载以及如何测试它?

require 'spec_helper'

describe Service::API, vcr: true do
  describe '.method' do
    it 'returns valid response' do
      #returns large body payload
      response = subject.method
      expect(response).to eq ???
    end
  end
end

1 个答案:

答案 0 :(得分:0)

您不应该测试有效负载,您需要测试该方法是否符合您对该有效负载的期望。 VCR将负责存储有效载荷。您可能需要断言您将所期望的内容发送给API,并断言您对结果执行的操作。您还应该测试失败方案,例如API超时或网络错误等。但是有效负载本身您不应该在测试中接触。

您可能会发现将测试分解为场景会有所帮助;

  • 使用正确的参数拨打电话
  • 给出一个不好的电话,例如API端缺少资源​​
  • 给出网络错误

我倾向于发现更简单地编写一些明显的场景,然后从每个场景的断言开始。像下面的东西,有点删节和使用RSpec,但你应该得到这个想法;

describe Transaction do
  # Create a real object in the api.
  let(:transaction) { create :transaction }

  describe '.find', :vcr do
    context 'given a valid id' do
      subject { Transaction.find(transaction.id) }

      it 'returns a Transaction object' do
        is_expected.to eq(transaction)
      end
    end

    context 'given an invalid transaction_id' do
      subject { Transaction.find('my-bad-transaction') }

      it 'should rescue Gateway::NotFoundError' do
        is_expected.to be_nil
      end

      it 'raises no NotFoundError' do
        expect { subject }.to raise_error(Gateway::NotFoundError)
      end
    end
  end
end