Как пропустить сервисный вызов в тесте rspec? - PullRequest
0 голосов
/ 01 сентября 2018

Я пишу тест для этой услуги.

  def run
    sort_offers(product).each do |product_code|
      ......
      offer.update(poduct_params)
      Importer::Partner.get_details(product_code).new
    end
  end

Он вызывает службу, которая в некоторых случаях переопределяет значения, которые были сохранены при запуске offer.update(product_prams). Как мне пропустить сервисный звонок в моем тесте?

Вот пример моего теста

 context 'is valid' do
  .... .....
  before do
    Importer::ProductCodes(product).run
  end
  it ......
end

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Я бы заглушил Importer::Partner.get_details, чтобы вернуть double, который отвечает на new:

context 'is valid' do
  before do
    allow(Importer::Partner).to receive(:get_details).and_return(double(new: nil))
  end  

  # it ...
end

В зависимости от ваших потребностей, вы можете добавить ожидание, что макет был вызван с правильными параметрами, и что new был также вызван на макет:

context 'is valid' do
  let(:mock) { double(new: nil) }

  before do
    allow(Importer::Partner).to receive(:get_details).and_return(double(new: nil))
  end  

  it "calls the service" do
    an_instance.run

    expect(Importer::Partner).to have_received(:get_details).with(
      foo: 'bar' # the arguments you would expect
    )
    expect(mock).to have_received(:new)
  end
end
0 голосов
/ 01 сентября 2018

RSpec имеет встроенную библиотеку для создания заглушек и заглушек ( rspec mocks ).

require 'spec_helper'

module Importer
  class Partner
    def self.get_details(product_code)
      "original return value"
    end
  end
end

class FooService
  def self.run
    Importer::Partner.get_details('bar')
  end
end

RSpec.describe FooService do
  let(:partner_double) { class_double("Importer::Partner") }

  before do
    stub_const("Importer::Partner", partner_double)
    allow(partner_double).to receive(:get_details).and_return 'our mocked value'
  end

  it "creates a double for the dependency" do
    expect(FooService.run).to eq 'our mocked value'
  end
end

class_double создает двойное значение для класса, и вы можете установить возвращаемые значения с помощью .expect и .allow и интерфейса для насмешки. Это весьма полезно, поскольку вы можете заглушить методы new или intialize, чтобы вернуть двойника или шпиона.

stub_constant вернет константу к ее предыдущему значению, когда спецификация будет выполнена.

Тем не менее, вы можете избежать использования stub_constant, используя инжектор конструктора в своих сервисах:

class PhotoImportService

  attr_accessor :client, :username

  def initialize(username, api_client: nil)
    @username = username
    @client = api_client || APIClient.new(ENV.fetch('API_KEY'))
  end

  def run
    client.get_photos(username)
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...