我有一种情况,我存在一个类的.new方法,但这使得它返回nil对象,后来需要这些对象,我不知道如何处理它。这是我的rspec代码:
describe ShopWorker do
describe '#perform' do
let(:worker) { ShopWorker.new }
it 'creates a new instance of Shopper' do
user = FactoryGirl.create(:user)
expect(Shopper).to receive(:new).with(user)
worker.perform(user.id)
end
end
end
这是我的工人代码:
class ShopWorker
include Sidekiq::Worker
def perform(user_id)
user = User.find(user_id)
shopper = Shopper.new(user)
shopper.start # This fails because Shopper.new returns NIL
end
end
所以,因为我使用expect(Shopper).to receive(:new).with(user)
来存储新方法,所以当它在worker中时,它会执行shopper.start,即为零,因此它会中断。我该怎么解决这个问题?理想情况下,我想测试一个新的Shopper实例,并且还为该实例调用了方法start。
答案 0 :(得分:1)
你可以做几件事:
:new
,但使用and_return()
提供返回值(可能是模拟)。问题是to receive
具有隐式and_return(nil)
,除非您明确提供返回值。:new
存根,让它在任何:start
实例上完成其工作并期待Shopper
:expect_any_instance_of(Shopper).to receive(:start)
。shopper.start
有什么影响?你能说出实际商业价值吗?