2015-11-11 3 views
0

У меня есть тест IntegrationSpec в Grails 2.3.6, который создает экземпляр любого контроллера, добавляет данные в тело (через controller.request.JSON), а затем проверяет правильность установки.Grails 2.3.6 IntegrationSpec Spock test не может изменить controller.request.JSON при использовании @Stepwise

Проблема заключается в том, что когда я добавляю аннотацию @Stepwise, она, кажется, блокирует объект request на объекте controller. В отладчике я вижу, что это один и тот же объект (на основе хэш-кода), и, как вы можете видеть из-за отказа теста ниже, во второй раз, когда тест выполняется со значением из блока where:, он терпит неудачу, поскольку первое значение из блок where: все еще присутствует.

@Stepwise 
class TestSpec extends IntegrationSpec { 

    @Unroll 
    void "changing controller request"() { 
     setup: 
     SomeController controller = new SomeController() 

     when: 
     controller.request.JSON = json 

     then: 
     controller.request.JSON == json 

     where: 
     json << [ 
       [one: "1"], 
       [two: "2"] 
     ] 
    } 
} 

Это сообщение об ошибке.

controller.request.JSON == json 
|   |  | | | 
|   |  | | [two:2] 
|   |  | false 
|   |  [one:1] 
|   org.code[email protected]55906c66 
[email protected] 

Это не сработает, если я удалю @Stepwise.

Есть ли способ принудительно воссоздать объект request или переопределить значение, установленное предыдущим тестом?

+0

Я считаю, что controller.response.reset() в очистке: в методе функции также будет разрешено это. – dsimer

ответ

0

Никогда не сработает - проблема беспокоит меня часами, я размещаю ее здесь, а затем выясняю решение.

Таким образом, я просмотрел IntegrationSpec, который является классом грааля, предназначенным для обработки спецификаций Spock в интеграционной среде. Я заметил, что методы setupSpec() и setup() будут инициализировать объект запроса, сделав звонок initRequestEnv(). К сожалению, это происходит только в том случае, если это не тест с @Stepwise. Я не уверен, почему.

Решение состоит в том, чтобы добавить эту проверку вручную в свой тест, добавив следующие строки в тест, который воссоздает объект request для каждого теста.

private GrailsTestRequestEnvironmentInterceptor perMethodRequestEnvironmentInterceptor = null 

def setup() { 
    perMethodRequestEnvironmentInterceptor = initRequestEnv() 
} 

def cleanup() { 
    perMethodRequestEnvironmentInterceptor?.destroy() 
}