ruby – 当对象的构造函数构建另一个对象时进行存根

所以我有一些代码,大致简化,看起来像这样:

class B
  def initialize opts
    @opts = opts
  end
end

class A
  def initialize opts
    # defaults etc applied to opts
    @b = B.new opts
  end
end

换句话说,当我使用选项初始化A时,它会创建一个B并将一组修改过的选项传递给它.

我想测试B.new得到正确的论点.现在,我正在这样做,使用RSpec / RR:

@b = Object.new
# stub methods on @b here
stub(B).new { |options|
  options[:foo].should == 'whatever'
  @b
}
A.new({:foo => 'whatever'})

但这有两个问题.

首先,我无法使用实际选项实例化B的实际副本.如果我在块中调用B.new,它会调用存根版本并循环直到堆栈弹出.我可以在存根之前设置@b = B.new,但我不知道将要传递的选项,从而打败了测试点.

(并且在有人打电话给我之前:是的,在严格的单元测试教条中,A的测试应该在B中删除任何方法,并且需要大量存根意味着你的代码首先是坏的.)

其次,将应用程序放在测试的设置中,而不是在单独的…之后…将…结束后,感觉是错误的.但由于我无法创建一个实际的B(见上文),我也无法真正询问其构建后的状态.

有任何想法吗?

最佳答案
您可以编写类似B.should_receive(:new).with({:foo =>’whatever’})的内容.

就个人而言,我避免抄袭/嘲笑,宁愿测试行为;使用给定的选项集创建新B的事实取决于实现,我不会直接测试.

转载注明原文:ruby – 当对象的构造函数构建另一个对象时进行存根 - 代码日志