作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个模块包含在另一个模块中,它们都实现了相同的方法。我想 stub 包含模块的方法,如下所示:
module M
def foo
:M
end
end
module A
class << self
include M
def foo
super
end
end
end
describe "trying to stub the included method" do
before { allow(M).to receive(:foo).and_return(:bar) }
it "should be stubbed when calling M" do
expect(M.foo).to eq :bar
end
it "should be stubbed when calling A" do
expect(A.foo).to eq :bar
end
end
第一个测试通过,但第二个输出:
Failure/Error: expect(A.foo).to eq :bar
expected: :bar
got: :M
为什么 stub 在这种情况下不起作用?有没有不同的方法来实现这一目标?
谢谢!
------------------------------------更新-------- --------------------------
谢谢!使用 allow_any_instance_of(M) 解决了这个问题。我的下一个问题是 - 如果我使用前置而不包括会发生什么?看下面的代码:
module M
def foo
super
end
end
module A
class << self
prepend M
def foo
:A
end
end
end
describe "trying to stub the included method" do
before { allow_any_instance_of(M).to receive(:foo).and_return(:bar) }
it "should be stubbed when calling A" do
expect(A.foo).to eq :bar
end
end
这一次,使用 allow_any_instance_of(M) 会导致无限循环。这是为什么?
最佳答案
注意你不能直接调用M.foo
!你的代码似乎只工作因为你 mock 了 M.foo
返回 :bar
.
当你打开A
元类 ( class << self
) 包括 M
,你必须模拟 M
的任何实例, 那就是添加到你的 before
block :
allow_any_instance_of(M).to receive(:foo).and_return(:bar)
module M
def foo
:M
end
end
module A
class << self
include M
def foo
super
end
end
end
describe "trying to stub the included method" do
before do
allow(M).to receive(:foo).and_return(:bar)
allow_any_instance_of(M).to receive(:foo).and_return(:bar)
end
it "should be stubbed when calling M" do
expect(M.foo).to eq :bar
end
it "should be stubbed when calling A" do
expect(A.foo).to eq :bar
end
end
关于ruby - 有没有办法用 Rspec stub 包含模块的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24408717/
我是一名优秀的程序员,十分优秀!