如何使用Ruby在RSpec测试之间重新加载模块?

如何使用Ruby在RSpec测试之间重新加载模块?,ruby,rspec,module,Ruby,Rspec,Module,我有一个模块,可以这样配置: module MyModule mattr_accessor :setting @@setting = :some_default_value end MyModule.setting = :custom_value 我正在用RSpec测试不同的配置选项,发现这些设置在不同的测试之间保持不变,因为它们是类变量 在RSpec测试之间重新加载和重新初始化模块的最佳方法是什么?1:您是否尝试在每个块之前要求文件在中 require 'my_module'

我有一个模块,可以这样配置:

module MyModule
   mattr_accessor :setting
   @@setting = :some_default_value
end

MyModule.setting = :custom_value
我正在用RSpec测试不同的配置选项,发现这些设置在不同的测试之间保持不变,因为它们是类变量


在RSpec测试之间重新加载和重新初始化模块的最佳方法是什么?

1:您是否尝试在每个块之前要求文件在

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

如果您认为在代码中设置此模块的默认值很有用,那么将此方法移到模块本身中可能是个好主意。

我想到了这个解决方案:

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

来源:

显示您的测试代码。你如何加载,如何测试?嗨,我也有同样的问题。。你找到干净的解决办法了吗?你有没有想过。。我有一个只在测试机器上可用的属性,所以我有允许(Rails.env)接收(:production?)的测试。。但是,一旦第一次测试运行,它就把所有其他测试都弄糟了。他们一个人很好。。为了这个。。我会用模拟的。。允许(MyModule).to receive(:setting).and_return(:custome_value),但您的问题可能是人为的,因此我可能没有抓住要点。解决方案1没有改变任何内容-文件已加载且已定义常量,因此不会重新加载。解决方案2可以工作,但它需要这个默认方法,它只在测试中使用。我想离那远点。仅供参考。使用
require
不起作用。(当时未定义常数)