如何在Ruby和rspec中处理潜在的Nil类的新方法

时间:2014-05-21 17:45:27

标签: ruby-on-rails ruby rspec

我有一种情况,我存在一个类的.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。

1 个答案:

答案 0 :(得分:1)

你可以做几件事:

  1. 期望接收:new,但使用and_return()提供返回值(可能是模拟)。问题是to receive具有隐式and_return(nil),除非您明确提供返回值。
  2. 不要将:new存根,让它在任何:start实例上完成其工作并期待Shopperexpect_any_instance_of(Shopper).to receive(:start)
  3. 问问自己这个测试提供了什么价值。测试对实现有很多了解,总是要改变它们。 shopper.start有什么影响?你能说出实际商业价值吗?