RSpec:对于在我调用的函数中实例化的对象,如何不能使用allow_any_instance_of`?]

问题描述 投票:0回答:2
我有一个带有方法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功能来做到这一点,但是我真的没有办法仅靠allowexpect来做到这一点。我知道我可以模拟现有实例和类的方法,但是从我的测试中,我无法使其对正在测试的方法中创建的对象的方法起作用。

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)@ ...

ruby-on-rails unit-testing rspec rspec-rails rspec3
2个回答
1
投票
此原因

allow(O).to receive(:F).and_return(123)


1
投票
(作为一小部分:我可以理解可能需要对代码进行非常彻底的匿名化,但是您仍然可以遵循ruby样式指南:方法以小写字母开头,只有类以大写字母开头]
© www.soinside.com 2019 - 2024. All rights reserved.