Как правильно заглушить REST-клиент в тестовой среде - PullRequest
0 голосов
/ 12 марта 2019

У меня есть базовая модель, подобная следующей

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?

1 Ответ

2 голосов
/ 12 марта 2019

Решение, которое должно работать без каких-либо дополнительных гемов:

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 будет использован double (вместо реального экземпляра клиента REST).

Наконец, вы вызываете метод в вашей модели и проверяете, получило ли double данное сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...