2013-10-23 49 views
1

在學習Grails的過程中,我有幾個域類。 「用戶」和「發佈」。這裏是每個重要的片段:關於訪問域對象的屬性困惑Grails

//Post 
static belongsTo = [user : User] 

//User 
static hasMany = [ posts : Post ] 

有了這些條款,刪除用戶時,帖子也應該是。

在我的集成測試中,我似乎錯誤地訪問這些帖子,我不知道爲什麼。下面是代碼:

//From my integration tests...Not mocked. 
def user = new User(userId: 'HenryTheThird', password:'thepassword').save() 
... 
def foundUser = User.get(user.id) 
def postNames = user.posts.collect{ it.content } 
assertEquals 2, postNames.size() 

foundUser.delete() 
assertFalse User.exists(foundUser.id) 
assertNull (foundUser.posts.collect{ it.content}) 

最後一行給我一個說法錯誤。我猜這是因爲當我聲明foundUser時,它帶來了所有的帖子。我似乎用我寫的另一個測試驗證了這一點。我的問題是,我怎麼能斷言數據庫中實際發現的用戶列表真的沒有任何文章呢?換句話說,我如何確認與該用戶關聯的帖子是否真的被刪除?

回答

1

您正在處理hibernate刷新會話和對象中的集合與數據庫中的數據之間斷開的時間。一個更好的測試可能如下:

foundUser.delete() 
assertFalse User.exists(foundUser.id) 
def deletedUserPosts = Post.findAllByUser(foundUser) 
assertTrue deletedUserPosts.size() == 0 

你也可以只考文章計數

assertTrue Post.count() == <some expected value> 
foundUser.delete() 
assertFalse User.exists(foundUser.id) 
assertTrue Post.count() == <some expected value> 
1

我發現,對於對象的刪除測試時,你最好清除會話:

this.sessionFactory.currentSession.flush() 
this.sessionFactory.currentSession.clear() 

以及測試對象的存在的數:

assertEquals 0, User.list().size() 
assertEquals 0, Post.list().size() 

把這4行寫在delete()函數後面,看看是否有所作爲。我認爲通過使用foundUser引用,您正在集成測試中訪問緩存對象?