域 class 与派生 属性 的 Grails3 单元测试

Grails3 unit test for domain class with derived property

我有以下域 class 和 derived property lowercaseTag

class Hashtag {
    String tag
    String lowercaseTag

    static mapping = {
        lowercaseTag formula: 'lower(tag)'
    }
}

如果我 运行 下面的单元测试,它会在最后一行失败,因为 lowercaseTag 属性 是 null 并且默认情况下所有属性都有 nullable: false约束。

@TestFor(Hashtag)
class HashtagSpec extends Specification {
    void "Test that hashtag can not be null"() {
        when: 'the hashtag is null'
        def p = new Hashtag(tag: null)

        then: 'validation should fail'
        !p.validate()

        when: 'the hashtag is not null'
        p = new Hashtag(tag: 'notNullHashtag')

        then: 'validation should pass'
        p.validate()
    }
}

问题是在这种情况下如何正确编写单元测试?谢谢!

我相信您已经知道,lowercaseTag 无法测试,因为它依赖于数据库; Grails 单元测试不使用数据库,因此 formula/expression 未评估。

我认为最好的选择是修改约束,使 lowercaseTag 可以为空。

class Hashtag {
    String tag
    String lowercaseTag

    static mapping = {
        lowercaseTag formula: 'lower(tag)'
    }

    static constraints = {
        lowercaseTag nullable: true
    }
}

否则,您必须修改测试以强制 lowercaseTag 包含 一些 值,以便 validate() 起作用。

p = new Hashtag(tag: 'notNullHashtag', lowercaseTag: 'foo')