我有以下带有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()
}
}
问题是如何在这种情况下正确编写单元测试?谢谢!
答案 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')