Ruby on rails 如何测试服务对象是否使用正确的参数初始化?
在Rails应用程序中,我有一个调用服务对象的后台作业Ruby on rails 如何测试服务对象是否使用正确的参数初始化?,ruby-on-rails,rspec,Ruby On Rails,Rspec,在Rails应用程序中,我有一个调用服务对象的后台作业 class MyJob < ActiveJob::Base def perform( obj_id ) return unless object = Object.find(obj_id) MyServiceObject.new(object).call end end 但是如何测试作业是否使用正确的参数初始化服务对象 describe MyJob, type: :job do let(:object)
class MyJob < ActiveJob::Base
def perform( obj_id )
return unless object = Object.find(obj_id)
MyServiceObject.new(object).call
end
end
但是如何测试作业是否使用正确的参数初始化服务对象
describe MyJob, type: :job do
let(:object) { create :object }
it 'initializes MyServiceObject with object' do
expect( MyServiceObject.new(object) ).to receive(:call)
MyJob.new.perform(object)
end
end
我想实现类似于上述的功能,但由于预期为1,但收到0,因此失败
测试类是否正确初始化的正确方法是什么 我可能建议进行以下测试:
describe MyJob, type: :job do
let(:object) { create :object }
it 'initializes MyServiceObject with object' do
expect( MyServiceObject).to receive(:new).with(object)
MyJob.new.perform(object)
end
end
显然,我对Adilbiy答案的修正被拒绝了,下面是我的更新答案:
describe MyJob, type: :job do
let(:object) { create :object }
it 'initializes MyServiceObject with object' do
so = MyServiceObject.new(object)
expect(MyServiceObject).to receive(:new).with(object).and_return(so)
MyJob.new.perform(object)
end
end
通过使用expect(MyServiceObject).to receive(:new).with(object)
模拟MyServiceObject.new
,可以覆盖原始实现。但是,要使MyJob#perform
正常工作,我们需要myservicecobject.new
返回一个对象,您可以使用执行该操作,并且_return(…)
希望这有帮助 谢谢@adilbiy,我也这么想。但是,这将返回nil:NilClass的NoMethodError:undefined方法'call'。由于某种原因,它导致MyServiceObject初始化时没有参数。这是100%正确的方法吗?我的代码似乎在测试之外正常工作,因此正在尝试找出问题所在。我修复了示例(添加了和_return
;正在查看),这应该可以修复问题。谢谢@mhutter,但我没有看到您的编辑。你能再发一次吗?
describe MyJob, type: :job do
let(:object) { create :object }
it 'initializes MyServiceObject with object' do
so = MyServiceObject.new(object)
expect(MyServiceObject).to receive(:new).with(object).and_return(so)
MyJob.new.perform(object)
end
end