具有派生属性的域类的Grails3单元测试

时间:2016-01-22 11:36:12

标签: unit-testing grails gorm grails-3.0

我有以下带有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()
    }
}

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

1 个答案:

答案 0 :(得分:1)

我确信你已经发现了,lowercaseTag无法测试,因为它依赖于数据库; Grails单元测试不使用数据库,因此不评估公式/表达式。

我认为最好的选择是修改约束,以便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')