我有两个测试问题。这两个问题可能都很容易回答。首先,我用Grails编写了这个单元测试:
void testCount() {
mockDomain(UserAccount)
new UserAccount(firstName: "Ken").save()
new UserAccount(firstName: "Bob").save()
new UserAccount(firstName: "Dave").save()
assertEquals(3, UserAccount.count())
}
由于某种原因,我得到了返回0的结果。我是不是忘了做什么?
编辑:哦,我明白了。验证约束被违反,所以它们没有存储。有没有办法在这里获得一些反馈?这真是一件很糟糕的事情...
第二个问题是给那些使用IDEA的人。我应该运行什么-IDEA的junit测试,还是grails目标?我有两个选择。
此外,为什么IDEA说我的测试通过了,即使上面的测试实际上失败了,它也提供了绿灯?如果我每次运行测试时都要检查html格式的测试报告,这真的会让我抓狂……
帮助?
发布于 2010-05-20 12:54:37
我总是在测试中使用object.save(failOnError: true)
,以避免像这样的静默失败。如果验证失败,这会导致抛出异常。即使单元测试中没有真正的数据库,大多数约束也会被检查,尽管如果我想测试域对象之间的复杂关系,我更喜欢使用集成测试。
发布于 2010-05-20 12:26:52
我个人并没有发现JUnit测试在使用grails时特别有用。使用测试运行器进行“单元”测试可能很好。对于集成测试,您可以考虑在"debug“模式下设置一个ant目标来运行您的测试。随着时间的推移,运行测试的时间越来越长,我倾向于只从命令行运行它们,以避免IntelliJ增加的额外开销。
关于你的单元测试,我很确定你需要运行一个集成测试来得到一个不为零的计数。
我不确定您确切地使用哪个单元测试,但是由于GORM在单元测试中不是自举的,所以我不确定域对象模拟是否支持计数的递增。
如果您的域对象经过验证,您的测试很可能会作为集成测试通过。
发布于 2010-05-20 18:54:04
将flush:true添加到保存方法中。
new UserAccount(firstName: "Ken").save(flush:true)
...
Grails将hibernate会话的刷新模式设置为手动。因此,更改不会在操作返回之后持久化,而是在呈现视图之前。这允许视图访问延迟加载的集合和关系,并防止更改自动持久化。
https://stackoverflow.com/questions/2870983
复制相似问题