私たちのクラスの多くでは、パフォーマンスのために高価な操作をキャッシュしています。例えば
def self.foo
@foo ||= get_foo
end
これはアプリケーションでうまく機能しますが、これらのメモ化された変数のためにテスト(RSpec)は失敗します。最初のテストの値は、新しい値が予想されるときに、後続のテストで返されます。
したがって、問題は、クラスをリロードするにはどうすればよいかということです。または、メモ化されたすべての変数を削除しますか?
after
サンプルグループに(または)ブロックを追加しbefore
て、インスタンス変数を削除します(問題のオブジェクトがサブジェクトであると想定)。
after do
subject.instance_variable_set(:@foo, nil)
end
または、問題を修正します。クラスインスタンス変数をメモ化することは、変更されないため、少し臭いです。テストごとに新しいオブジェクトを作成するため、通常のインスタンス変数ではこの問題は発生しません。
キャッシュされたデータが正しいままであるか、無効な場合に削除されるように、クラスとテストを構築します。キャッシュをクリアするメソッドを追加し、rspecbefore
ブロックで呼び出すことを検討してください。