1

在学习 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 时,它会带入所有帖子。我似乎已经用我写的另一个测试验证了这一点。我的问题是,我如何断言数据库中的实际 foundUser 列表真的没有任何帖子了?换句话说,我如何验证与该用户关联的帖子是否真的被删除了?

4

2 回答 2

1

您正在处理休眠刷新会话与对象中的集合与数据库中的数据之间的断开连接之间的时间。更好的测试可能如下:

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>
于 2013-10-23T13:49:49.843 回答
1

我发现在测试删除对象时,最好清除会话:

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

以及测试存在的对象数量:

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

将这 4 行放在您调用 delete() 之后,看看是否有所不同。我认为通过使用您的 foundUser 引用,您正在访问集成测试中的缓存对象???

于 2013-10-23T13:50:23.190 回答