Я хотел бы узнать, как правильно имитировать вызовы объектов внутри других классов, например, у меня есть следующее действие контроллера:
def show
service = Action::PartsShow.new(show_params, current_user)
service.call
render json: service.part, root: :part, serializer: PartSerializer, include: '**',
scope: {current_user: current_user}
end
Класс обслуживания выглядит следующим образом.
module Action
class PartsShow < PartsShowBase
def find_part
...
end
end
end
module Action
class PartsShowBase
attr_reader :part
def initialize(params, current_user)
@params = params
@current_user = current_user
end
def call
find_part
reload_part_availability
reload_part_price if @current_user.present?
end
private
def reload_part_availability
ReloadPartAvailabilityWorker.perform_async(part.id)
end
def reload_part_price
ExternalData::LauberApi::UpdatePrices.new(@current_user, [part]).execute
end
end
end
Я не хочу вызывать действительную Action::PartsShow
службу внутри этого действия контроллера и все другие методы, службы + рабочий, потому что это делает тест очень медленным.Я хочу проверить, вызывается ли этот сервис, и высмеивать остальные сервисы.Я не хочу вызывать их в своих тестах, я хочу издеваться над ними.
Мой тест выглядит так:
RSpec.describe PartController, type: :request do
describe 'GET #show' do
let(:part) { create(:part) }
subject { get "/api/v1/parts/#{part.id}" }
expect(response_body).to eq(200)
# ...
end
end
Не могли бы вы показать мне, как правильно издеваться над ним?Я читал о насмешках и заглушках RSpec, но я в замешательстве.Буду признателен за вашу помощь.