gpt4 book ai didi

ruby - 有没有办法用 Rspec stub 包含模块的方法?

转载 作者:数据小太阳 更新时间:2023-10-29 06:26:58 25 4
gpt4 key购买 nike

我有一个模块包含在另一个模块中,它们都实现了相同的方法。我想 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com