这个问题正在寻找一种方法来允许对 rspec 3.9 示例中的模块中的常量进行无限定引用。这主要是为了节省空间和打字。
module MyConsts
FOO = "foo"
end
RSpec.describe "Tests Module Constants" do
it 'has unqualified access to constants.' do
expect(FOO).to eq("foo")
end
end
Run Code Online (Sandbox Code Playgroud)
这是一种从 module 包含辅助函数的便捷方法,但它与在类上使用 include 不同,因为常量无法按预期使用。
module MyConsts
FOO = "foo"
end
RSpec.configure do |c|
c.include MyConsts
end
RSpec.describe "Tests Module Constants" do
it 'has qualified access to constants.' do
expect(MyConsts::FOO).to eq("foo")
end
it 'has unqualified access to constants.' do
expect(FOO).to eq("foo")
end
end
Run Code Online (Sandbox Code Playgroud)
不合格访问示例失败。如果能够混合模块中的常量就好了,这样这样的例子就可以通过。
Failures:
1) Tests Module Constants has unqualified access to constants.
Failure/Error: expect(FOO).to eq("foo")
NameError:
uninitialized constant FOO
Run Code Online (Sandbox Code Playgroud)
describe不起作用。从之前关闭的 rspec 问题来看,人们可能会相信在describe块内使用 include 是可行的。它不是。
Failures:
1) Tests Module Constants has unqualified access to constants.
Failure/Error: expect(FOO).to eq("foo")
NameError:
uninitialized constant FOO
Run Code Online (Sandbox Code Playgroud)
对一个非常相似的问题的回答建议使用shared_context. 虽然它确实产生了最终结果,但需要复制常量定义。这是一个问题,因为它们有数百个,常量模块完全是从另一个项目中提取的,并且使它们保持最新的工作量太大。
一种方法是在模块上下文中定义 RSpec 测试:
module MyConsts
FOO = "foo"
end
module MyConsts
RSpec.describe "Tests Module Constants" do
it "has unqualified access to constants." do
expect(FOO).to eq("foo")
end
end
end
Run Code Online (Sandbox Code Playgroud)
RSpec.describe 定义一个模块,如果它被定义为 MyConsts 的子模块,则常量查找将冒泡到 MyConsts。
您也可以在顶层混合 MyConsts:
include MyConsts
Run Code Online (Sandbox Code Playgroud)
这种方法可能不太理想,因为它会使这些常量可以在任何地方使用,使它们有效地全局化,这可能比您想要的更容易泄漏。
| 归档时间: |
|
| 查看次数: |
381 次 |
| 最近记录: |