我有一个类A
和一个方法M
,我想为其编写测试T
。问题在于方法M
创建了一个新对象O
。我想模拟该新对象F
的方法O
。
class A
def M(p1,p2)
@o = O.new(p1,p2)
end
end
class O
def F(q)
...
end
end
我可以很容易地使用RSpec的allow_any_instance_of
功能来做到这一点,但是我真的没有办法仅靠allow
或expect
来做到这一点。我知道我可以模拟现有实例和类的方法,但是从我的测试中,我无法使其对正在测试的方法中创建的对象的方法起作用。
T :process do
it "works" do
# This works
allow_any_instance_of(O).to receive(:F).and_return(123)
...
end
it "does not works" do
# This fails
allow(O).to receive(:F).and_return(123)
...
end
end
我怎么知道它失败了?
我用F
更改了puts()
方法,当我使用allow(O)
时可以在屏幕上看到该输出。当我使用allow_any_instance_of()
时,它根本不会出现。因此,我知道它只能在后者中按预期工作。
def F(q)
puts("If I see this,then F() was not mocked properly.")
...
end
我认为allow(O)...
应该连接到该类,因此,每当创建一个新实例时,模拟函数就会随之而来,但显然不是。
您是否有RSpec测试以不涉及使用allow_any_instance_of()
函数的不同方式来处理这种模拟情况?
我问的原因是因为它是RSpec 3.3以来的marked as obsolete(@allow-old-syntax
),所以听起来我们不应该再使用此功能,尤其是RSpec 4.x发行后,将消失。