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发布后,它很可能就会消失了。 >
我有一个类A,它要为其编写测试T的方法M。问题是方法M创建了一个新对象O。我想模拟该新对象O的方法F。类A def M (p1,p2)@ ...
allow(O).to receive(:F).and_return(123)