Grails集成测试 - 重复表单提交始终为invalidToken

时间:2015-04-30 08:19:01

标签: grails integration-testing

我已经尝试过我的单元测试来测试重复的表单提交,就像在文档中一样,并且它有效。 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]
    }    
}

1 个答案:

答案 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部分中的“测试控制器”。