RSpec: 如何在被测对象的方法内部存根?

RSpec: How to stub inside a method of the object being tested?

这里有一个 rspec 新手。我知道我可以使用 'allow( ).to receive( ).and_return' 存根被测对象的方法,但是如果我正在测试的对象本身使用另一个具有昂贵方法的对象,我该如何存根该方法中的 expensiv 部分 e 但仍然测试方法的其余部分?

也就是说,如果我有这样的方法

class Foo
  def process
   data = DataModel.fetch_data #<-- the expensive process.
    if verify(data)
      [do things]
    end
  end

  private 
  def verify(data)
    [...]
  end
end

那么我将如何编写一个 rspec 测试,我可以在其中为过程方法提供测试数据,以便我可以检查验证和 "do things" 是否正常工作?我不想执行 DataModel.fetch 因为它既费时又费钱。 (Rails 5.2)

你可以这样做:

fetched_data = instance_double("TheClassReturnedFrom#fetch_data")
allow(DataModel).to receive(:fetch_data).and_return(fetched_data)