1

直接来自“Grails 权威指南(第二版)”的第 104 页:

void testLoginUserNotFound() {
    mockRequest.method = "POST"
    mockDomain(User)
    MockUtils.prepareForConstraintsTests(LoginCommand)
    def cmd = new LoginCommand(login:"fred", password:"letmein")

    cmd.validate()
    controller.login(cmd)

    assertTrue cmd.hasErrors()
    assertEquals "user.not.found", cmd.errors.login
    assertEquals "/store/index", renderArgs.view
}

运行此测试时,它会失败并显示:

junit.framework.AssertionFailedError: junit.framework.AssertionFailedError: null

...我追查到当时的“cmd”引用为空。在调用action controller.login 之前,cmd 有效并填充,之后为null。

如何测试命令对象?

4

2 回答 2

0

cmd不是null;然而,assertTrue抛出一个AssertionFailedError带有null消息的。提供默认消息 ( assertTrue "default message", cmd.hasErrors()) 或仅声明assert cmd.hasErrors().

那么,让我们看看为什么cmd.hasErrors()返回false。- 这是因为自定义验证器不返回false,而是返回一些字符串,true根据“Groovy Truth”计算结果。(在那里,自本书出版以来,Grails API 似乎发生了变化。)

LoginCommand课堂上,改变

login blank:false, validator:{ val, cmd ->
    if(!cmd.user)
        return "user.not.found"
}

login blank:false, validator:{ val, cmd ->
    if(!cmd.user)
        return false
}

然后,错误代码将是“LoginCommand.login.validator”。
如果您需要自定义错误代码,您可以自己添加错误对象(不返回任何内容),如下所示:

login blank:false, validator:{ val, cmd ->
    if(!cmd.user)
        cmd.errors.rejectValue('login', 'user.not.found')
}

PS:你不应该直接使用这个MockUtils类,而是extend GrailsUnitTest. 此外,MockUtils.prepareForConstraintsTests(Class)已弃用;此外,它不适合命令对象。- 改用该mockForConstraintsTests(Class)方法,继承自GrailsUnitTest.

于 2010-11-03T16:22:41.123 回答
0

我在控制器单元测试中使用此方法为命令对象添加额外的管道:

  private def invoke(String action) {
    def types = controller."$action".parameterTypes
    if (types && types.length == 1) {
      Class cmdClass = types[0]
      mockCommandObject(cmdClass)
      def cmd = cmdClass.newInstance()
      controller.params.each{ key, value ->
        try{ cmd."$key" = value } catch(MissingPropertyException ex){}
      }
      cmd.validate()
      controller."$action"(cmd)
    } else {
      controller."$action"()
    }
  }

测试看起来像这样:

    setup:
    controller.params.contractNum = "invalid"


    when:
    invoke "lookup"
于 2011-11-18T20:57:12.980 回答