【问题标题】:Grails - Unit test a controller's method using the reCaptcha pluginGrails - 使用 reCaptcha 插件对控制器的方法进行单元测试
【发布时间】:2011-09-28 18:58:59
【问题描述】:

我想对以下方法进行单元测试:

def handleEmailSharing = { EmailSharingCommand esc ->
        if (params.send) {
            def recaptchaOK = true
            if (!recaptchaService.verifyAnswer(session, request.getRemoteAddr(), params)) {
                recaptchaOK = false
            }

         }
...

这是我正在尝试的方式:

import com.megatome.grails.RecaptchaService

class EmailSharerControllerTests extends ControllerUnitTestCase {

    protected void setUp() {
     controller.recaptchaService = new RecaptchaService()
   }

void testHandleEmailSharingSendAndSuccess() {
       mockCommandObject(EmailSharingCommand)
        def emailSharingCommand = new EmailSharingCommand(from: "acorrect@emailaddress.fr", 
                                                          to: "   anothercorrect@emailaddress.fr   ,    whichis@notalone.it   ", 
                                                          cc: "", 
                                                          bcc:"someonein@bcc.com.br",
                                                          trimmedListOfToRecipients: ["anothercorrect@emailaddress.fr", "whichis@notalone.it"])
        emailSharingCommand.validate()
}
controller.handleEmailSharing(emailSharingCommand)

但我收到以下错误:

Cannot get property 'recaptcha' on null object
java.lang.NullPointerException: Cannot get property 'recaptcha' on null object
    at com.megatome.grails.RecaptchaService.getRecaptchaConfig(RecaptchaService.groovy:33)
    at com.megatome.grails.RecaptchaService.this$2$getRecaptchaConfig(RecaptchaService.groovy)
    at com.megatome.grails.RecaptchaService$this$2$getRecaptchaConfig.callCurrent(Unknown Source)
    at com.megatome.grails.RecaptchaService.isEnabled(RecaptchaService.groovy:100)
    at com.megatome.grails.RecaptchaService$isEnabled.callCurrent(Unknown Source)
    at com.megatome.grails.RecaptchaService.verifyAnswer(RecaptchaService.groovy:81)
    at com.megatome.grails.RecaptchaService$verifyAnswer.call(Unknown Source)
    at bankemist.personalcreditcomparator.EmailSharerController$_closure2.doCall(EmailSharerController.groovy:49)
    at bankemist.personalcreditcomparator.EmailSharerControllerTests.testHandleEmailSharingSendButtonButMissingFromAndTo(EmailSharerControllerTests.groovy:49)

这很奇怪,因为它基本上说我的org.codehaus.groovy.grails.commons.ConfigurationHolder 为空,或者它包含的recaptcha 对象。 RecaptchaService.groovy的调用线33是:

if (ConfigurationHolder.config.recaptcha) {...}

或者(最后一个:))我的 RecaptchaConfig.groovy 是这样设置的:

recaptcha {
    // These keys are generated by the ReCaptcha service
    publicKey = "xxx"
    privateKey = "xxx"

    // Include the noscript tags in the generated captcha
    includeNoScript = true
}

mailhide {
    // Generated by the Mailhide service
    publicKey = ""
    privateKey = ""
}

environments {
  development {
    recaptcha {
      // Set to false to disable the display of captcha
      enabled = true

      // Communicate using HTTPS
      useSecureAPI = false
    }
  }
  test {
    recaptcha {
      // Set to false to disable the display of captcha
      enabled = true

      // Communicate using HTTPS
      useSecureAPI = false
    }
  }

我无法解决这个问题。 我试图将 configurationHolder 导入到测试文件中,但它并没有改变任何东西。非常感谢任何帮助。

【问题讨论】:

    标签: unit-testing grails configuration controller recaptcha


    【解决方案1】:

    单元测试将没有 ConfigurationHolder,因为它们不在运行的框架内执行。在单元测试中,最好的选择是模拟 RecaptchaService,所以在你的测试方法中像这样:

    def recapMock = mockFor(RecaptchaService)
    recapMock.demand.verifyAnswer(1..1) { session, remoteAddr, params ->
         return true // Or false if you want it to fail in your test
    }
    controller.recaptchaService = recapMock.createMock()
    // Then run your test
    controller.handleEmailSharing(emailSharingCommand)
    

    【讨论】:

      【解决方案2】:

      您应该注入一个 recaptchaService 并模拟 verifyAnswer 以返回您想要为您的测试用例返回的任何内容。

           def recaptchaServiceMock = mockFor(recaptchaService)
      
                  recaptchaServiceMock.demand.verifyAnswer() {Session session, 
                                                              Map params->
                      return true
                  }
      
            currentService.recaptchaService = recaptchaServiceMock.createMock()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2014-06-23
        • 1970-01-01
        • 2012-03-31
        相关资源
        最近更新 更多