在学习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时,它会带来所有帖子。我似乎用我写过的另一个测试证实了这一点。我的问题是,我怎么能断言DB中的实际foundUser列表真的没有任何帖子了?换句话说,如何验证与该用户关联的帖子是否已被删除?
答案 0 :(得分: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 :(得分:1)
我发现在测试删除对象时,最好清除会话:
this.sessionFactory.currentSession.flush()
this.sessionFactory.currentSession.clear()
以及测试存在的对象数量:
assertEquals 0, User.list().size()
assertEquals 0, Post.list().size()
在调用delete()之后放下这4行,看看是否有所不同。我认为通过使用您的foundUser引用,您正在访问集成测试中的缓存对象???