Я пробовал новые функциональные тесты в 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?
Спасибо, Матео.
GebSpec
? Вы не используете какую-либо часть Geb, если отправляете запрос приложению с помощьюHttpClient
. - person erdi   schedule 05.09.2015