Grails测试打嗝

时间:2010-05-20 04:19:00

标签: unit-testing testing grails intellij-idea

我有两个测试问题。两者都可能很容易回答。首先是我在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中的测试报告,这真的会让我感到疯狂.......

帮助?

3 个答案:

答案 0 :(得分:2)

我总是在测试中object.save(failOnError: true)来避免像这样的无声失败。如果验证失败,这会导致抛出异常。即使没有单元测试中的真实数据库,也会检查大多数约束,但如果我想测试域对象之间的复杂关系,我更喜欢使用集成测试。

答案 1 :(得分:1)

我个人没有发现Idea JUnit测试在使用grails时特别有用。使用测试运行器进行“单元”测试可能很好。对于集成测试,您可以考虑在“调试”模式下设置ant目标以运行测试。  随着时间的推移,运行测试开始占用这么长的时间,我倾向于从命令行专门运行它们,以避免IntelliJ增加的额外开销。

关于您的单元测试,我很确定您需要运行集成测试才能获得非零的计数。

我不确定您使用的单元测试是什么,但由于GORM未在单元测试中进行自举,因此我不确定域对象模拟是否支持计数的增量。

如果您的域对象验证,您的测试可能会作为集成测试通过。

答案 2 :(得分:0)

将flush:true添加到保存方法中。

new UserAccount(firstName: "Ken").save(flush:true)
...

Grails将hibernate会话的刷新模式设置为手动。因此,在操作返回后,更改不会保留,而是在呈现视图之前。这允许视图访问延迟加载的集合和关系,并防止更改自动保留。