Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Ruby和rspec中处理具有潜在Nil类的存根新方法_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

Ruby on rails 如何在Ruby和rspec中处理具有潜在Nil类的存根新方法

Ruby on rails 如何在Ruby和rspec中处理具有潜在Nil类的存根新方法,ruby-on-rails,ruby,rspec,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(S

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

您可以做以下几件事:

  • 期望收到
    :新的
    ,但使用
    和_return()
    提供返回值(可能是模拟值)。问题是,除非显式提供返回值,否则接收的
    具有隐式
    和返回(nil)
  • 不要存根
    :new
    ,让它完成它的工作,并期望
    :在任何
    购物者上启动
    ,实例:
    期望(购物者)的任何实例。接收(:start)
  • 问问自己这个测试提供了什么价值。测试对实现有很多了解,在某种程度上,您必须同时更改这两个方面。
    购物者启动的影响是什么?你能断言关于实际业务价值的任何东西吗

  • 第三点很好。这个测试只是试图找出工作人员实际实例化了一个对象(实际上是谁完成了所有的工作,我在另一部分中对此进行了测试)。