【问题标题】:Grails unit test for domain class insertBefore域类 insertBefore 的 Grails 单元测试
【发布时间】:2011-05-25 11:19:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: groovy grails-domain-class grails-constraints


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 作者明确:他创建了一个对象,尝试保存,结果没有调用beforeInsert。
      • 不,据我了解作者:在测试环境中调用 myObject.save() 会导致错误。
      • 真的。无论如何,这个问题还不够精确。是单元测试还是集成测试?保存仅在集成测试中可用,除非调用了 mockDomain。
      • 该方法没有被调用(没有错误)。这是一个单元测试(请参阅问题标题,我也将其添加到正文中)。谢谢。
      • 我建议在您的对象上创建一个 integrationTest 并调用 save()。或者编写一个方法:myBeforeInsert() 并将 beforeIsert 中的代码放入其中。然后只需在 beforeInsert 中调用 myBeforeInsert。然后,您可以在单元测试中测试 myBeforeInsert() 中的代码。
      【解决方案4】:

      我遇到了同样的问题!在 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 方法。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-14
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 2017-05-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多