【问题标题】:Where and how to expect on Rspec / VCR stubbed response?在哪里以及如何期望 Rspec / VCR 存根响应?
【发布时间】:2016-03-15 10:13:53
【问题描述】:

我正在为我们正在使用的 API 编写一个 ruby​​ 客户端。我们使用 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

【问题讨论】:

  • 响应有多大?
  • 40 KB 的原始 json(数千行格式化的 json)。

标签: ruby rspec vcr


【解决方案1】:

您不应该测试有效负载,您需要测试该方法是否符合您对该有效负载的期望。 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多