对访问域对象Grails的属性感到困惑

时间:2013-10-23 13:10:00

标签: grails junit

在学习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列表真的没有任何帖子了?换句话说,如何验证与该用户关联的帖子是否已被删除?

2 个答案:

答案 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引用,您正在访问集成测试中的缓存对象???