Функциональный тест Grails/Geb: класс предметной области доступен после второго вызова

Я пробовал новые функциональные тесты в Grails 3. Он тестирует простой REST API, создает запрос POST и затем проверяет, был ли создан новый ресурс.

import geb.spock.GebSpec
import grails.converters.JSON
import grails.test.mixin.integration.Integration
import grails.transaction.Rollback
import groovy.util.logging.Slf4j
import org.apache.http.client.methods.HttpPost
import org.apache.http.entity.StringEntity

@Integration
@Rollback
@Slf4j
class QuestionFunctionalSpec extends GebSpec {
    void "POST  to /questions creates new question"() {
        setup:
        log.debug("Existing questions: ${Question.list().collect { [id: it.id, text: it.text] }}")
        def jsonRequest = [text: "How to cook for people?"] as JSON

        when: "The api call is made"
        def httpPost = new HttpPost("localhost:8080/api/v1/questions")
        httpPost.setEntity(new StringEntity(jsonRequest.toString()));
        HttpClients.createDefault().execute(httpPost)

        then: "New question was created"
        //log.debug("Questions after test (first domain class call): ${Question.list().collect { [id: it.id, text: it.text] }}")
        //log.debug("Questions after test (second domain class call): ${Question.list().collect { [id: it.id, text: it.text] }}")
        assert Question.list().size() == 1
    }
}

Локально все работало хорошо, но при запуске на моем сервере CI мой тест не прошел. Раскомментировав первый log.debug(), я получил сообщение о том, что в базе данных нет ресурса Question, однако тест не провалился. Раскомментировав второй log.debug(), я увидел, что ресурс Question на самом деле существует, но он доступен только при вызове второго класса домена.

Я что-то пропустил здесь. Я подозревал, что Apache HttpClient не является синхронным, но на самом деле это так. У вас есть подобный опыт? Есть ли проблема с синхронизацией в Geb?

Спасибо, Матео.


person kuceram    schedule 04.09.2015    source источник
comment
Почему вы расширяете GebSpec? Вы не используете какую-либо часть Geb, если отправляете запрос приложению с помощью HttpClient.   -  person erdi    schedule 05.09.2015
comment
Я использую его в некоторых других тестовых функциях, здесь я тестирую только REST API. Однако это не отвечает на мой вопрос. Недавно я узнал, что вы должны использовать плагин удаленного управления для доступа к GORM, я не должен полагаться на ту же JVM, stackoverflow.com/questions/28505134/   -  person kuceram    schedule 07.09.2015
comment
Да, потому что тесты и тестируемое приложение запускаются на разных JVM при запуске функциональных тестов.   -  person erdi    schedule 07.09.2015


Ответы (1)


Я обнаружил, что к GORM не следует обращаться напрямую в функциональных тестах, поскольку сам тест потенциально может выполняться в отдельной JVM (вызов методов GORM из тестов Geb).

Целесообразно использовать подключаемый модуль удаленного управления (https://grails.org/plugin/remote-control ). Однако он пока не поддерживает Grails 3 (https://github.com/alkemist/grails-remote-control/issues/27).

person kuceram    schedule 07.09.2015