2011-11-25 82 views
15

我有以下類: 我想確保類url只爲所有實例設置一次。如何清除ruby中的rspec測試之間的類變量

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 

我有兩個測試:

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.new,但我不知道如何去做這件事。

+0

不完全與您的問題相關,但:*從不*在Ruby中使用@@類變量。改用@class實例變量。他們的表現更可預測。 –

回答

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

當我跑這我得到了以下錯誤: ** NameError:在對象初始化類變量@@網址** 我用它來工作: '前(:每個)做 DataFactory.class_eval {class_variable_set: @@ url,nil} end' _I我使用的JRuby 1.6.5,我相信使用Ruby 1.8.9和class_variable_set可能在這個版本中是私人的,所以我不得不使用class_eval_ 請參見:[http://www.khelll的.com /博客/紅寶石/紅寶石反射-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