gpt4 book ai didi

ruby - RSpec - 模拟(或 stub )覆盖的 mixin 方法

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

我有这样的情况:

module Something
def my_method
return :some_symbol
end
end

class MyClass
include Something

def my_method
if xxx?
:other_symbol
else
super
end
end
end

现在问题出在测试上——我想确保从覆盖方法调用 super 方法并将其 stub ,以便我可以测试方法的其他部分。我如何使用 RSpec 模拟来实现这一点?

最佳答案

确保 super 被调用听起来很像测试实现,而不是行为,并且模拟被测对象无论如何都不是一个好主意。我建议只明确指定不同的代码路径

describe "#my_method" do
it "returns :other_symbol when xxx" do
...
end

it "returns :some_symbol when not xxx" do
...
end
end

如果您有很多包含该模块的类,您可以使用共享示例来减少测试中的重复。

shared_examples_for "Something#my_method" do
it "returns :some_symbol" do
expect(subject.my_method).to eq :some_symbol
end
end

describe MyClass do
describe "#my_method" do
context "when xxx" do
subject { ... }

it "returns :other_symbol" do
expect(subject.my_method).to eq :other_symbol
end
end

context "when not xxx" do
subject { ... }

it_behaves_like "Something#my_method"
end
end
end

更新:如果您真的无法预测mixin的行为,您可以通过以下方式切换super调用的方法包括定义它的另一个模块。

如果您有一个包含模块 MN 的类 C,它们都定义了一个方法 f,然后在 C#f 中,super 将引用最后包含的模块。

class C
include M
include N

def f
super # calls N.f because it was included last
end
end

如果您将它包含在您的被测对象的单例类中,那么它不会影响任何其他测试:

describe MyClass do
describe "#my_method" do
it "calls super when not xxx" do
fake_library = Module.new do
def my_method
:returned_from_super
end
end

subject.singleton_class.send :include, fake_library

expect(subject.my_method).to be :returned_from_super
end
end
end

免责声明:这实际上并没有测试 mixin 是否有效,只是调用了 super。我仍然建议实际测试行为。

关于ruby - RSpec - 模拟(或 stub )覆盖的 mixin 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14546905/

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