В Grails 4 есть некорректная проверка - PullRequest
1 голос
/ 09 июля 2020

Я работаю над обновлением довольно большого приложения Grails 2.5 до Grails 4.0.3. У меня есть что-то похожее в моей доменной структуре на мой пример здесь.

package com.test

class Face {

    static hasOne = [mouth: Mouth]

    static constraints = {
    }
}

package com.test

abstract class Mouth {
    Face face

    static constraints = {
    }
}

package com.test

class BigMouth extends Mouth {
    Integer numberOfTeeth
    Boolean tonsilsRemoved

}

Поведение, которое я ожидаю увидеть при проверке объекта лица, состоит в том, что он также должен проверять объект рот. Итак, у меня есть тестовый Контроллер, настроенный для тестирования этого типа

package com.test

class TestController {

    def index() { 
        Face face = new Face()
        face.mouth = new BigMouth(
                face: face
        )

        // numberOfTeeth & tonsilsRemoved cannot be null, but are
        assert !face.validate()
        println 'no failure'
    }
}

И тестового примера

package com.test

import grails.testing.gorm.DomainUnitTest
import spock.lang.Specification

class FaceSpec extends Specification implements DomainUnitTest<Face> {

    def setup() {
    }

    def cleanup() {
    }

    void "test hasOneValidation"() {
        when:
        domain.mouth = new BigMouth(numberOfTeeth: null)

        then:
        !domain.validate()
    }
}

Однако поведение, которое я вижу, заключается в том, что лицо действительно и оно не передает утверждение assert. У нас это сработало в 2.5. Еще одно замечание относительно этого тестового примера: если я переместу свойства BigMouth в Mouth и сделаю его конкретным классом, тот же тест будет иметь объект-лицо, которое не проходит проверку и передает оператор assert.

Это ожидаемое поведение для Grails 4.0.3 или нет? Если нет, то я что-то здесь явно не так делаю?

Запуск Grails 4.0.3, Java 11, Windows 10

1 Ответ

0 голосов
/ 15 июля 2020

Это, по-видимому, вызвано этой ошибкой в Grails 4. Иерархия домена пытается применить дочерние ограничения к родительскому объекту, но не может этого сделать, потому что свойства дочернего элемента не существуют в родитель.

...