gpt4 book ai didi

ruby - 使用 rspec 测试 Ruby 模块

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

我很难在 SO/Google 上找到这个特殊案例。我有一个带有函数的模块,为了使用它们,您必须创建一个包含/扩展模块的类,具体取决于您需要实例方法还是类方法。

module A
def say_hello name
"hello #{name}"
end

def say_bye
"bye"
end
end

如何使用 rspec 测试此模块?

我有这样的事情,我不确定我应该在哪里创建类和扩展模块。

describe A do
class MyClass
extend A
end

before(:each) { @name = "Radu" }

describe "#say_hello" do
it "should greet a name" do
expect(Myclass.say_hello(@name)).to eq "hello Radu"
end
end
end

谢谢!

最佳答案

您可以在测试中创建一个匿名类:

describe A do
let(:extended_class) { Class.new { extend A } }
let(:including_class) { Class.new { include A } }

it "works" do
# do stuff with extended_class.say_hello
# do stuff with including_class.new.say_hello
end
end

为了在实际代码中看到类似的东西,我对 testing my attr_extras lib 使用了这种策略.

就是说,includeextend 是 Ruby 的标准功能,所以我不会测试每个模块在包含和扩展时都能正常工作——这通常是给定的.

如果您在测试中创建一个命名类,就像您在问题中所做的那样,我相信该类将在您的测试运行期间全局存在。因此,此类将在您的测试套件的每个测试之间泄漏,可能会在某处造成冲突。

如果你使用 let 创建一个匿名类,它只会在这个特定的测试中可用。没有指向它的全局常量可能与其他测试冲突。

您还可以使用 RSpec 的 stub_const获得一个不会泄漏的常量,如果需要:

stub_const("MyClass", Class.new { … })
# do stuff with MyClass

请注意,您将在 beforeit 中运行 stub_const。不仅在文件顶部或类上下文中。

关于ruby - 使用 rspec 测试 Ruby 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27341800/

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