Я следующий тест (который, вероятно, более функционального теста, чем интеграция, но ...):Grails 3 Интеграция Spec имеет Странное поведение транзакционной
@Integration(applicationClass = Application)
@Rollback
class ConventionControllerIntegrationSpec extends Specification {
RestBuilder rest = new RestBuilder()
String url
def setup() {
url = "http://localhost:${serverPort}/api/admin/organizations/${Organization.first().id}/conventions"
}
def cleanup() {
}
void "test update convention"() {
given:
Convention convention = Convention.first()
when:
RestResponse response = rest.put("${url}/${convention.id}") {
contentType "application/json"
json {
name = "New Name"
}
}
then:
response.status == HttpStatus.OK.value()
Convention.findByName("New Name").id == convention.id
Convention.findByName("New Name").name == "New Name"
}
}
Данные загружаются через Bootstrap (который admittadly может быть проблемой), но проблема в том, что я в блоке then
; он находит Convention
по новому имени и совпадениям id
, но при тестировании поля name
он терпит неудачу, поскольку он все еще имеет старое имя.
При чтении документации по тестированию я думаю, что проблема заключается в том, на какой сессии создаются данные. Поскольку @Rollback
имеет сеанс, который отделен от BootStrap
, данные на самом деле не гелеобразуют. Например, если я загружаю данные через блок теста given
, тогда эти данные не существуют, когда мой контроллер вызывается RestBuilder
.
Вполне возможно, что я не должен делать такой тест таким образом, поэтому предложения ценятся.
Спасибо, Burt. Это помогает понять некоторые вещи. То, что меня сбивало с толку, было в Grails 2, там была довольно четкая линия между Integration и Functional (поскольку в то время функциональные тесты не были гражданами первого класса), а в Grails 3, создание функционального теста использует '@ Integration' и' @Rollback 'в шаблоне для GebSpec. – Gregg
Функциональные тесты в основном состоят из граждан первого сорта, но для создания тестовой/функциональной папки это зависит от плагина.Вначале это определенно сбивает с толку, что в Grails 3 интеграционные и функциональные тесты используют одну и ту же папку и что веб-сервер запускается для тестов интеграции, что еще больше размывает различия. –
Вау, это объясняет, почему я не мог получить откаты, работающие в прошлые дни. Я понял, что что-то происходит по этим линиям. Большое вам спасибо за разъяснение этого. Существуют ли какие-либо рекомендации по настройке и откату данных функциональных (API) тестовых данных? В настоящее время я настраиваю свои данные через BootStrap, как и Gregg, и отменяет изменения в блоках очистки через вызовы API после прохождения теста. –