8

私たちのクラスの多くでは、パフォーマンスのために高価な操作をキャッシュしています。例えば

def self.foo
    @foo ||= get_foo
end 

これはアプリケーションでうまく機能しますが、これらのメモ化された変数のためにテスト(RSpec)は失敗します。最初のテストの値は、新しい値が予想されるときに、後続のテストで返されます。

したがって、問題は、クラスをリロードするにはどうすればよいかということです。または、メモ化されたすべての変数を削除しますか?

4

2 に答える 2

7

afterサンプルグループに(または)ブロックを追加しbeforeて、インスタンス変数を削除します(問題のオブジェクトがサブジェクトであると想定)。

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

または、問題を修正します。クラスインスタンス変数をメモ化することは、変更されないため、少し臭いです。テストごとに新しいオブジェクトを作成するため、通常のインスタンス変数ではこの問題は発生しません。

于 2012-07-13T02:10:41.317 に答える
5

キャッシュされたデータが正しいままであるか、無効な場合に削除されるように、クラスとテストを構築します。キャッシュをクリアするメソッドを追加し、rspecbeforeブロックで呼び出すことを検討してください。

于 2012-07-13T02:13:02.220 に答える