2013-07-13 11 views
6

私はそうのように構成することができるモジュールがあります。RubyでRSpecテスト間でモジュールをリロードする方法は?

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

MyModule.setting = :custom_value 

を私はRSpecの持つさまざまな設定オプションをテストしています、そして、彼らはクラス変数であるため、設定が異なるテスト間持続していることが分かりました。

RSpecテストの間にモジュールをリロードして再初期化するにはどうすればよいですか?

+1

テストコードを表示します。どうやってロードしていますか、どのようにテストしていますか? – vgoff

+0

こんにちは、私は同じ問題を抱えています。あなたは清潔な解決策を見つけましたか? – masciugo

+0

あなたはこれを理解したことがありますか?私はテストマシンでしか利用できない属性を持っていますので、(Rails.env)、(production:)を受け取るテストがあります。しかし、それは他のすべてを駄目にする。ただ彼らは大丈夫です。 – baash05

答えて

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 

あなたのコードでは、このモジュールの値をデフォルト設定のための良好な使用を見る場合はそれもモジュール自体にメソッドを移動するには良い考えかもしれません。

+0

解決策1は何も変更されません。ファイルは既にロードされており、定数は定義されていますが、リロードされません。 ソリューション2は動作しますが、テストでのみ使用されるthis to_defaultメソッドが必要です。私はそれから離れていたいと思います。 –

2

私は、このソリューションに来た:

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/

関連する問題