Ruby on 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)

在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) { 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