質問

Hibernateの世界では、多くの場合、合格するように見えるユニットテストを受けることができますが、実際にはキャッシュされたデータを扱っているため表示されないバグがあります。たとえば、保存をカスケードしていると思って子供と一緒に親を救うことができます。保存後に親のために再クエリをして、子コレクションのサイズをテストする場合、それは大丈夫に見えます。しかし、実際には、Hibernateは子供を救わなかったが、親をキャッシュしたので、あなたは救われていない子供たちを見ています。これを回避する1つの方法は、保存とクエリの間のセッションキャッシュをクリアすることで、データがデータベースから直接来ていることがわかります。

これはActivereCordの問題ですか?モデルを保存してから同じテストで照会すると、実際にデータベースからデータを取得するのではなく、クエリキャッシュから取得する可能性がありますか?これに対処しようとするサンプルテストは見たことがないので、それを問題以外にするものがあるかどうか疑問に思っていますか?

役に立ちましたか?

解決

はい。テストの書き方によっては、Railsクエリキャッシュが干渉する場合があります。 Railsは、キャッシュをクリアする必要がある場合(オブジェクト間に明らかな関連性がある場合)を追跡するのに十分賢い場合がありますが、以下は予想どおりに動作しない例です。

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.size.should_not == [] # Fails, since the original query was cached.

一般に、同じテストで同じクエリを2回実行している場合は、2番目のクエリを実行しようとする前に、データに.reloadを呼び出す必要があります。そのようです:

user.posts.should == []
Post.create(:user_id => user.id)
user.posts.reload
user.posts.size.should_not == []

私の個人的な経験では、上記の方法を使用するよりも、テストを作成する別の方法を検討することをお勧めします。たとえば、クエリキャッシュの影響を受けない上記のより良い方法を次に示します。

lambda { Post.create(:user_id => user.id) }.should_change(user.posts, :count).by(1)

他のヒント

ActivereCordの問題としてこれに遭遇したことはありません。私の理解では、キャッシュは読み取りのみであるため、セーブは常に実行されます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top