2015-04-30 2 views
5

Я пробовал в своем модульном тесте, чтобы протестировать повторную подачу формы, как в документах, и это сработало. http://grails.github.io/grails-doc/3.0.x/guide/testing.html#unitTestingControllersТест интеграции с Grails - Повторная подача формы всегда invalidToken

Но в моем тесте интеграции он всегда терпел неудачу и помечен как invalidToken. Я пишу его так же, как модульный тест в стороне tokenHolder.

Итак, как обрабатывать действительный токен withForm в тесте интеграции?

Моя Интеграция Тест:

@TestFor(RegisterTestedController) 
class RegisterTestedControllerIntSpec extends Specification { 
    void "test insert data register"() { 
     given: 
     controller.params.username == 'babaenciel' 
     controller.params.companyName == 'tamago' 

     when: 
     def tokenHolder = SynchronizerTokensHolder.store(session) 
     params[SynchronizerTokensHolder.TOKEN_URI] = '/registerTested/signUp' 
     params[SynchronizerTokensHolder.TOKEN_KEY] = tokenHolder.generateToken(params[SynchronizerTokensHolder.TOKEN_URI]) 

     controller.signUp() 

     then:   
     controller.modelAndView.model.parameter.username == 'babaenciel' 
     controller.modelAndView.model.parameter.companyName == 'tamago' 
    } 
} 

Контроллер:

class RegisterTestedController { 
    def signUp() { 
     log.info("session: " + session.properties) 
     log.info("request: " + request.properties) 
     log.info("params: " + params) 

     def invalidToken = false 

     withForm { 
      invalidToken = false 
     }.invalidToken { 
      invalidToken = true 
     } 

     log.info("invalid token: " + invalidToken) 

     if(invalidToken) { 
      flash.code = 'alert-red' 
      flash.message = message(code: "error.general.multipleSubmission") 
      redirect action:'index' 
      return 
     }   

     render view: 'index', model: [parameter: params] 
    }  
} 

ответ

1

В интеграции тесты на PARAMS должен быть установлен для нового экземпляра контроллера, который вы должны создать вручную (см http://grails.github.io/grails-doc/2.5.0/guide/testing.html#integrationTesting). Также сеанс недоступен в тестах интеграции по умолчанию. Вы можете получить его через RequestContextHolder следующим образом: RequestContextHolder.currentRequestAttributes().session.

Полный код должен выглядеть следующим образом:

YourController yourController = new YourController() 

def token = SynchronizerTokensHolder.store(RequestContextHolder.currentRequestAttributes().session) 
yourController.params[SynchronizerTokensHolder.TOKEN_URI] = '/yourController/yourAction' 
yourController.params[SynchronizerTokensHolder.TOKEN_KEY] = token.generateToken(yourController.params[SynchronizerTokensHolder.TOKEN_URI]) 

yourController.yourAction() 

Также обратите внимание: В Grails 3.0 рекомендуется использовать функциональные тесты вместо интеграционных тестов. См. «Контрольные контрольные точки» в разделе Integration Testing справочной документации Grails.

Смежные вопросы