2010-02-23 58 views
1

在Hibernate的世界裏,你可以經常看到單元測試通過,但實際上有一些錯誤,因爲你正在處理緩存數據而沒有顯示出來。例如,您可以將其父母與其子女一起保存,認爲它是級聯保存的。如果您在保存後重新查詢父級並測試子集合的大小,則看起來沒問題。但實際上,Hibernate並沒有拯救孩子,而是緩存了父母,所以你正在看着未保存的孩子。解決此問題的一種方法是清除保存和查詢之間的會話緩存,以便您知道數據直接來自數據庫。在ActiveRecord單元測試中處理查詢緩存很重要嗎?

這是ActiveRecord的問題嗎?如果我保存一個模型然後在同一個測試中查詢它,是否有可能實際上沒有從數據庫中獲取數據,而是從查詢緩存中獲取數據?我還沒有看到任何試圖處理這個問題的示例測試,所以我想知道是否有什麼東西使得它不成問題?

回答

1

是的。根據您編寫測試的方式,Rails查詢緩存有時可能會產生干擾。有時,Rails是一個足夠聰明的跟蹤緩存時需要被清除(當有物體之間存在明顯的關聯),但在這裏是因爲預計不會表現爲例:

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

在一般情況下,如果您在同一測試中執行相同的查詢兩次,您應該在嘗試執行第二個查詢之前調用.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)

0

我從來沒有遇到過這個問題與ActiveRecord。我的理解是緩存僅在讀取時保存,因此始終執行保存。