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

Nik*_*mov 8 ruby rspec module

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

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

MyModule.setting = :custom_value
Run Code Online (Sandbox Code Playgroud)

我正在使用RSpec测试不同的配置选项,并发现设置在不同测试之间持续存在,因为它们是类变量.

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

seq*_*elo 5

我来到了这个解决方案:

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
Run Code Online (Sandbox Code Playgroud)

来源:http : //geminstallthat.wordpress.com/2008/08/11/reloading-classes-in-rspec/


Ere*_*bih 0

1:您是否尝试要求文件在一个before :each块中?

require 'my_module'
Run Code Online (Sandbox Code Playgroud)

2:我不知道在这里重新加载文件是否正确。从看来,您想要的只是某个类的值再次成为默认值,为此我只需创建一个方法,将模块的值更改为我希望的值。

describe MyModule do

  def module_to_default
    MyModule.setting = :some_default_value
  end

  before :each do
    module_to_default
  end
end
Run Code Online (Sandbox Code Playgroud)

如果您发现在代码中默认此模块值有很好的用途,那么将该方法移至模块本身可能是一个好主意。