【问题标题】:How to cleanly stub out REST client when in test environment在测试环境中如何干净地存根 REST 客户端
【发布时间】:2019-03-12 14:03:24
【问题描述】:

我有一个像下面这样的基本模型

class MyModel
    def initialize(attrs)   
        @attrs = attrs
        @rest_client = Some::REST::Client.new 
    end

    def do_a_rest_call(some_str)
      @rest_client.create_thing(some_str)
    end
end

出于测试目的,我不希望 @rest_client 进行远程调用。相反,在测试环境中,我只想确保 @rest_client 在经过某些代码分支时被特定的 some_str 调用。

在理想的世界中,我会有一个类似于以下的断言:

expect(my_model_instance).to.receive(do_a_rest_call).with(some_str) 在测试中我将通过 some_str 以确保它是正确的。

使用 RSpec 3.8 和 Rails 5.2.2 的最佳方法是什么?

【问题讨论】:

  • 我不知道“最好的方法”。 (你如何量化“最佳”?)但是,我使用webmock,这让我觉得这不是那么糟糕。

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


【解决方案1】:

无需任何额外宝石即可工作的解决方案:

let(:rest_client_double) { instance_double(Some::REST::Client, create_thing: response) }

it 'sends get request to the RestClient' do
  allow(Some::REST::Client).to receive(:new).and_return(rest_client_double)

  MyModel.new(attrs).do_a_rest_call(some_str)

  expect(rest_client_duble).to have_received(:create_thing).with(some_str).once
end

基本上,您正在为 REST 客户端创建一个替身。 然后,确保在调用 Some::REST::Client.new 时使用双精度(而不是真正的 REST 客户端实例)。

最后,您在模型上调用一个方法并检查是否双重收到给定消息。

【讨论】:

  • create_thing 参数中的值是什么?
  • 在第一行?在那里,您定义应该返回的方法名称和响应。所以,如果你打电话给Some::REST::Client.new.create_thing,你会得到response
猜你喜欢
  • 2014-10-14
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多