2

如何使用 Grails 中的单元测试来测试 Groovy Domain-Classes 的 initBefore 方法?

我创建了虚拟对象,但在调用 myObject.save() 之前不会调用 beforeInsert 方法,并且 save 在测试环境中不可用。

编辑:它是一个单元测试。没有错误,但是没有调用 beforeInsert 方法

4

4 回答 4

5

在单元测试期间调用 beforeInsert。我可以在我的测试中验证这一点。需要考虑的几件事:

  1. 确保使用 beforeInsert 方法,而不是闭包。闭包将无法正常工作。
  2. 它在对象被刷新时被调用,因此您可能事先遇到了静默保存错误。在您保存对象时的测试中执行 .save(flush: true, failOnError: true)
于 2013-10-15T22:51:40.497 回答
0

是否要测试 beforeInsert 方法是否被调用或 beforeInsert 的逻辑是否正确?

如果你想测试 beforeInsert 是否被调用,测试类应该扩展 GrailsUnitTestCase。这样做应该为您提供模拟功能并添加所有方法,如 save() 和 validate()。您可以在执行 save() 时验证模拟对象是否调用了 beforeInsert 方法。

如果您正在测试 beforeInsert 的逻辑,那么您不需要模拟它。您可以像其他单元测试一样创建对象并测试逻辑。

希望这可以帮助。

于 2011-06-23T04:11:27.693 回答
0

只需创建一个域对象并保存()它。然后检查“beforeInsert”是否操纵了您的对象。

save() 在测试环境中可用。请在调用 myDomainobject.save() 时显示您的 Stacktrace

于 2011-12-05T08:11:47.290 回答
0

我有同样的问题!在 GORM 中(至少在当前版本之前)save 方法不会因为被调用而立即生效!如果您希望它立即生效,您需要flush:true像这样指定domain.save(flush:true)

它在这里说http://grails.org/doc/2.2.x/ref/Domain%20Classes/save.html

save 方法通知持久性上下文应该保存或更新一个实例。除非使用 flush 参数,否则对象不会立即持久化:

要回答您的问题,在保存保存(保存生效)之前不会调用 beforeInsert ,因此您应该调用 save with flush 来测试beforeInsertbeforeUpdate方法。

希望这可以帮助!

于 2014-11-10T14:06:26.943 回答