Вызов MockDomain с предоставлением данных домена прибора не работает, что мне не хватает?Грааль 2.0.1 - PullRequest
7 голосов
/ 14 марта 2012

Я пытаюсь выполнить простое моделирование класса Domain в рамках модульного теста для службы Grails согласно документации, но, похоже, она не работает вообще, поскольку запросы для экземпляров всегда возвращают null.Я что-то упустил?Вот соответствующая часть моего кода, для ясности я изменил имена классов и методов тестирования:

@TestFor(MyService)
@TestMixin(DomainClassUnitTestMixin)

class MyServiceTests {


    void testMyThing() {
        defineBeans {anotherService(AnotherService)} //My service under test uses another service, unlikely relevant?

        MyUser.metaClass.isDirty = { //workaround for mockDomain not adding isDirty method.
            println("dirty check called");
        }

        mockDomain(MyUser, [
                [username: "email@gmail.com", accountType: UserType.STANDARD, id: 1L],
                [username: "user@gmail.com", accountType: UserType.STANDARD, id:3L],
                [username: "bizuser@domain.com", accountType: UserType.BUSINESS, id:2L]
        ])

        MyUser user1 = MyUser.get(1);
        System.out.println("user 1: ${user1}"); // output is 'user 1: null'

        MyUser user1byName = MyUser.findByUsername("email@gmail.com");
        System.out.println("user 1 by name: ${user1byName}"); // output is 'user 1 by name: null'

        ... the actual testing stuff which would love to have non null MyUser objects ...
 }        
}

1 Ответ

11 голосов
/ 14 марта 2012

Я понял это, и вы бы подумали, что я подумал бы об этом, учитывая, что меня это уже укусило.Проблема заключалась в проверке и в поведении Grails GORM по умолчанию, когда он молчаливо не сохранял данные в save () (который mockDomain должен использовать при передаче данных для своих ложных экземпляров), если в классе Domain есть ошибки проверки.MyUser требовался непустой пароль.

Давным-давно я добавил grails.gorm.failOnError=true в свой Config.groovy для своего приложения, так что я никогда больше об этом не думаю, но, конечно, его не читают для юнит-тестов

По моему мнению, это делает эту подпись mockDomain очень хрупкой (и я не мог найти способ установить failOnError = true).Я переключил настройку фиктивных данных на следующую, которая дает точно такой же результат, но дает немедленный сбой, если вы неправильно настроили свои данные.

@Mock(MyUser)
class MyServiceTests {
    ...

    void testMyThing() {
        new MyUser(username: "email@gmail.com", 
                   accountType: UserType.STANDARD, 
                   id: 1L).save(failOnError:true)  //throws exception because MyUser requires password field to be non blank
     ...
    }
}
...