我已经尝试过我的单元测试来测试重复的表单提交,就像在文档中一样,并且它有效。 http://grails.github.io/grails-doc/3.0.x/guide/testing.html#unitTestingControllers
但是在我的集成测试中,它始终失败并标记为invalidToken。我用与tokenHolder部分中的单元测试相同的方式编写它。
那么如何在Integration Test中处理有效令牌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]
}
}
答案 0 :(得分:1)
在集成测试中,需要为必须手动创建的新控制器实例设置参数(参见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中,建议使用功能测试而不是集成测试。请参阅Grails参考文档的Integration Testing部分中的“测试控制器”。