【问题标题】:Grails Integration Test - Duplicate Form Submission always invalidTokenGrails 集成测试 - 重复的表单提交总是 invalidToken
【发布时间】:2015-04-30 08:19:00
【问题描述】:

我已经在我的单元测试中尝试像在文档中一样测试重复的表单提交并且它有效。 http://grails.github.io/grails-doc/3.0.x/guide/testing.html#unitTestingControllers

但在我的集成测试中,它总是失败并标记为 invalidToken。我用与tokenHolder部分的单元测试相同的方式编写它。

那么如何在集成测试中用Form处理有效的token呢?

我的集成测试:

@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]
    }    
}

【问题讨论】:

    标签: grails integration-testing


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

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多