allow
和have_received
时遇到问题我有一个名为Obj
的模型,该模型与一个名为belongs_to
的模型具有Parent
关系。 Parent
模型与has_many
具有Obj
关系。
在Obj
模型中,我定义了一种称为child_method
的方法。在Parent
模型中,我定义了一种名为calls_child_method
的方法,该方法遍历与之关联的每个Obj
,并让它们调用child_method
我正在编写一个规范来测试此行为,如下所示,但它总是失败:
describe 'parent calls_child_method' do
let(:obj) { Obj.create }
before do
allow(obj).to receive(:child_method)
end
it 'should call child_method' do
obj.parent.calls_child_method
expect(obj).to have_received(:child_method)
end
end
输出:
expected: 1 time with any arguments
received: 0 times with any arguments
但是,当我使用allow_any_instance_of
进行间谍/打桩时,这似乎过去了:
describe 'parent calls_child_method' do
let(:obj) { Obj.create }
before do
allow(obj).to receive(:child_method)
end
it 'should call child_method' do
expect_any_instance_of(Obj).to receive(:child_method)
obj.parent.calls_child_method
end
end
或者如果我直接调用子方法:
describe 'parent calls_child_method' do
let(:obj) { Obj.create }
before do
allow(obj).to receive(:child_method)
end
it 'should call child_method' do
obj.child_method
expect(obj).to have_received(:child_method)
end
end
在所有这些中,我已经验证了所创建的Obj
实例实际上是通过使用child_method
调试来查看其正在被调用的。byebug
有人可以帮我理解为什么规范/间谍的行为是这样的吗?
我在我的规范中使用allow和have_received时遇到问题,我有一个名为Obj的模型,该模型与一个称为Parent的模型有一个Emirates_to关系。父模型与...
在失败的情况下,obj
是对新创建的Obj.create
的引用。通过调用expect(obj).to have_received(:child_method)
,期望精确引用obj
应该收到child_method
。