2012-07-13 72 views
4

在我們的許多類中,我們緩存昂貴的性能操作。例如如何重新加載紅寶石類

def self.foo 
    @foo ||= get_foo 
end 

這適用於應用程序,但測試(RSpec)由於這些memoized變量而失敗。當我們預計新值時,第一次測試的值將在隨後的測試中返回。

所以問題是:如何重新加載類?或者刪除所有memoized變量?

回答

2

以緩存數據保持正確的方式構建您的類和測試,或者在無效時刪除它們。考慮添加一個方法來清除緩存並在rspec before塊中調用它。

+0

是的,我認爲這是最好的方法和更乾淨的解決方案。謝謝 – Sebastian 2012-07-13 02:46:58

6

一個after(或before)塊添加到示例組以除去實例變量(假設所討論的對象是對象):

after do 
    subject.instance_variable_set(:@foo, nil) 
end 

或者解決該問題。擁有memoized類的實例變量有點味道,因爲它永遠不會改變。普通的實例變量不會有這個問題,因爲你會爲每個測試創建一個新的對象。

+0

謝謝,我想這也會起作用,但是與其他解決方案相同的問題,這會使測試維護變得困難,因爲您需要明確地取消設置變量 – Sebastian 2012-07-13 02:16:22

+0

是的,我傾向於不首先進行記憶。 – Sebastian 2012-07-13 02:22:27

+0

是的。作爲一般指導原則:如果很難糾正你的測試,那真的是測試過的代碼是錯誤的。 – 2012-07-13 02:48:51