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