Модульный тест Grails3 для доменного класса с производным свойством

У меня есть следующий класс домена с производным свойством 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()
    }
}

Вопрос в том, как правильно писать юнит-тесты в таких случаях? Спасибо!


person Igor    schedule 22.01.2016    source источник
comment
Почему свойство называется lowercaseTag, а формула определяется для несуществующего свойства lowercase?   -  person Emmanuel Rosa    schedule 22.01.2016
comment
@EmmanuelRosa извините, опечатка   -  person Igor    schedule 22.01.2016


Ответы (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')
person Emmanuel Rosa    schedule 22.01.2016
comment
Другой вариант — написать этот тест с @HibernateTestMixin, который запустит модульный тест для базы данных H2. - person Joe; 01.03.2016