Модульный тест Grails для доменного класса insertBefore

Как я могу протестировать метод initBefore доменных классов Groovy с помощью модульного теста в Grails?

Я создал фиктивный объект, но метод beforeInsert не вызывается до тех пор, пока не будет вызван myObject.save(), а сохранение недоступно в тестовых средах.

Изменить: это модульный тест. ошибки нет, но метод beforeInsert не вызывается


person LukeSolar    schedule 25.05.2011    source источник


Ответы (4)


beforeInsert вызывается во время модульных тестов. Я могу убедиться в этом на своих тестах. Несколько вещей, которые следует учитывать:

  1. убедитесь, что вы используете метод beforeInsert, а не замыкание. Закрытие не будет работать правильно.
  2. он вызывается, когда объект сбрасывается, поэтому, возможно, у вас заранее возникают ошибки молчаливого сохранения. В вашем тесте, когда вы сохраняете объект, выполните .save(flush: true, failOnError: true)
person Peter    schedule 15.10.2013
comment
Моя проблема заключалась в использовании замыкания, которая проистекает из ответа Берта из списка рассылки в 2010 году: grails.1312388.n4.nabble.com/Read-only-domain-td1461440.html - person Joseph; 20.11.2013

Вы хотите проверить, вызывается ли метод beforeInsert или верна ли логика beforeInsert?

Если вы хотите проверить, вызывается ли метод beforeInsert, тестовый класс должен расширять GrailsUnitTestCase. Это должно дать вам возможности для насмешек и добавить все методы, такие как save() и validate(). Вы можете проверить, вызывал ли издевательский объект метод beforeInsert или нет, когда вы выполняете save().

Если вы тестируете логику beforeInsert, вам не нужно издеваться над ней. Вы можете создать объект и протестировать логику так же, как и другие модульные тесты.

Надеюсь это поможет.

person thomas.han    schedule 23.06.2011

Просто создайте объект домена и сохраните его. Затем проверьте, манипулировал ли «beforeInsert» вашим объектом.

save() доступен в тестовых средах. Пожалуйста, покажите свою трассировку стека при вызове myDomainobject.save()

person Rene    schedule 05.12.2011
comment
Автор явно: создал объект, попытался его сохранить, а он не вызвал beforeInsert. - person Antoine; 05.12.2011
comment
нет, насколько я понимаю автора: вызов myObject.save() в тестовой среде вызывает ошибки. - person Rene; 05.12.2011
comment
истинный. В любом случае, вопрос недостаточно точен. Это модульные или интеграционные тесты? Сохранение доступно только в интеграционных тестах, если не был вызван mockDomain. - person Antoine; 05.12.2011
comment
метод не вызывался (ошибки не было). это модульный тест (см. заголовок вопроса, и я также добавил его в тело). благодаря. - person LukeSolar; 05.12.2011
comment
Я предлагаю создать IntegrationTest и вызвать save() для вашего объекта. Или напишите метод: myBeforeInsert() и поместите в него код из beforeIsert. Затем просто вызовите myBeforeInsert в beforeInsert. затем вы можете протестировать код в myBeforeInsert() в модульном тесте. - person Rene; 05.12.2011

У меня была точно такая же проблема! В GORM (по крайней мере, до текущей версии) метод сохранения не вступает в силу сразу только потому, что он вызывается! Если вы хотите, чтобы он вступил в силу сразу, вам нужно указать flush:true вот так domain.save(flush:true).

здесь написано http://grails.org/doc/2.2.x/ref/Domain%20Classes/save.html

Метод сохранения информирует контекст сохраняемости о том, что экземпляр следует сохранить или обновить. Объект не будет сохранен немедленно, если не используется аргумент flush:

Чтобы ответить на ваш вопрос, beforeInsert не вызывается до тех пор, пока сохранение не будет сохранено (сохранение вступит в силу), поэтому вы должны вызвать сохранение с флешем для проверки методов beforeInsert и beforeUpdate.

Надеюсь это поможет!

person Amanuel Nega    schedule 10.11.2014