【问题标题】:Grails unit tests not recognizing .save() on a domain classGrails 单元测试无法识别域类上的 .save()
【发布时间】:2013-08-06 04:10:53
【问题描述】:

我正在努力成为一名优秀的小程序员,并为我的 Grails 2.2.3 应用程序设置单元测试。使用 GORM 注入的.save() 方法的单元测试显然没有持久化到模拟测试数据库。例如,以下是一个测试的组成部分:

@TestFor(TermService)
@Mock(Term)
class TermServiceTests {
    void testTermCount() {
        def t = new Term(code: "201310").save(validate: false, flush: true, failOnError: true)
        println "Printing Term: " + t.toString()

        assert 1 == Term.count() // FAILS
        assert service.isMainTerm(t) // FAILS
    }
}

我做了一个println,最终打印了Printing Term: null,这意味着 Term 没有保存并返回一个 Term 实例。第一个断言为 false,Term.count() 返回 0。

有人知道为什么会这样吗?我有一个模拟 Term 和 TermService (我相信通过 TestFor 注释),所以我不太确定为什么这不起作用。谢谢!

编辑:这是我的学期课程。

class Term {

    Integer id
    String code
    String description
    Date startDate
    Date endDate

    static mapping = {
        // Legacy database mapping
    }

    static constraints = {
        id blank: false
        code maxSize: 6
        description maxSize: 30
        startDate()
        endDate()
    }
}

【问题讨论】:

  • 设置validate:true看看你是否缺少任何约束
  • Term 长什么样子?
  • @Alidad 我肯定缺少一些约束,但我认为设置validate: false 意味着保存时不会触发验证,因此我不必填写所有字段。 @dmahapatro 我在原始帖子中添加了术语。
  • 为什么是Integer id? GORM 默认为Long id,不需要明确指定。
  • id 生成器是否已分配?您可以在测试中尝试t.id = 1 然后t.save(...),而不将id 设置为映射结构。

标签: unit-testing testing grails junit


【解决方案1】:

看起来id 生成器是assigned,因为您提到了使用旧数据库。另外id 在域类中默认是不可绑定的(map 构造不适用于 id)。所以,我认为你最终必须使用如下:

def t = new Term(code: "201310")
t.id = 1
t.save(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 2021-03-30
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多