2011-11-25 23 views
15

私は次のクラスを持っています: クラスURLがすべてのインスタンスに対して一度だけ設定されていることを確認します。ルビーのrspecテスト間でクラス変数をクリアするには

it "should log a message" do 
    APP_CONFIG = {"my value" => "test"} 
    Rails.stub(:logger).and_return(logger_mock) 
    logger_mock.should_receive(:debug).with "Setting url" 

    t = DataFactory.new 
    t = nil 
end 

it "should throw an exception" do 
    APP_CONFIG = nil 

    expect { 
    DataFactory.new 
    }.to raise_error(DataFactoryError, /Error!/) 
end 

問題は、第二の試験はまだ最初のテスト第二のテスト実行から設定された@@ URLクラス変数として例外をスローしたことがないです。

class DataFactory 
    @@url = nil 

    def initialize() 
begin 
    if @@url.nil? 
     Rails.logger.debug "Setting url" 
     @@url = MY_CONFIG["my value"] 
    end 
rescue Exception 
    raise DataFactoryError, "Error!" 
end 
    end 
end 

は、私は2つのテストを持っています。 最初のテストの終わりにnilにインスタンスを持っていても、2回目のテストが実行される前にガベージコレクションがメモリをクリアしていません:

アイデアは素晴らしいでしょう! Class.newを使用する可能性があると聞いてきましたが、これについてどうやって行くのか分かりません。ここで

+0

ない正確にあなたの問題に関連していますが、Rubyでは@@クラス変数を使用しません。代わりに@classインスタンス変数を使用してください。彼らは予想よりもはるかに行動します。 ** NameError:オブジェクトで初期化されていないクラス変数@@ URL ** 私が使用して動作するようにそれを得た: 'の前に(各) DataFactory.class_eval {class_variable_setを行い、私はこれを実行したとき –

答えて

19
describe DataFactory 
    before(:each) { DataFactory.class_variable_set :@@url, nil } 
    ... 
end 
+1

は、私は次のエラーを得ました: @@ url、nil} end' _ Ruby 1.8.9とclass_variable_setを使用していると思われるJRuby 1.6.5を使用しているため、このバージョンではプライベートである可能性がありますので、class_eval_を使用してください。 参照:[http://www.khelll .com/blog/ruby​​/ruby​​-reflection-2 /] –

3

がしばらくの間は、あなたの特定の例を解決しないだろう受け入れ答え、に代わるものです、私はそれは同じ静脈に質問して少数の人々を助けるかもしれない願っています。問題のクラスは、デフォルト値を指定して、セットまで未定義のままにしていない場合、これが動作しているようです:より多くのようなものを持つクラスを持つ私にとって

describe DataFactory 
    before(:each) do 
    DataFactory.remove_class_variable :@@url if DataFactory.class_variable_defined? :@@url 
    end 
    ... 
end 

作品:

def initialize 
    @@url ||= MY_CONFIG["my value"] 
    ... 
end 
関連する問題