【发布时间】:2019-09-24 17:32:36
【问题描述】:
我想学习如何在其他类中正确地模拟对象调用,例如我有这个控制器操作:
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 模拟和存根,但我对此感到困惑。非常感谢您的帮助。
【问题讨论】:
标签: ruby rspec rspec-rails