我有一个可以这样配置的模块:
module MyModule
mattr_accessor :setting
@@setting = :some_default_value
end
MyModule.setting = :custom_value
我正在使用RSpec测试不同的配置选项,并发现不同测试之间的设置仍然存在,因为它们是类变量。
在RSpec测试之间重新加载和重新初始化模块的最佳方法是什么?
答案 0 :(得分:4)
我来到这个解决方案:
describe MyModule do
before :each do
# Removes the MyModule from object-space (the condition might not be needed):
Object.send(:remove_const, :MyModule) if Module.const_defined?(:MyModule)
# Reloads the module (require might also work):
load 'path/to/my_module.rb'
end
it "should have X value" do
MyModule.setting = :X
expect(MyModule.setting).to eq :X
end
end
来源:http://geminstallthat.wordpress.com/2008/08/11/reloading-classes-in-rspec/
答案 1 :(得分:0)
1:您是否尝试在before :each
块中要求该文件?
require 'my_module'
2:我不知道重新加载文件是否正确。从你看来你想要的是一些类的值再次成为默认值,因为我只是创建一个方法,将模块的值更改为我想要的任何值。
describe MyModule do
def module_to_default
MyModule.setting = :some_default_value
end
before :each do
module_to_default
end
end
如果您认为在代码中默认使用此模块值很有用,那么将该方法移入模块本身可能是个好主意。