gpt4 book ai didi

unit-testing - Grails 1.3.5 Controller 测试空命令对象

转载 作者:行者123 更新时间:2023-12-02 14:55:47 24 4
gpt4 key购买 nike

直接来自“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。

如何测试命令对象?

最佳答案

cmd不是 null ;但是,assertTrue抛出 AssertionFailedErrornull信息。提供默认消息 (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”。
如果需要自定义错误码,可以 add an error object自己(不返回任何东西),像这样:
login blank:false, validator:{ val, cmd ->
if(!cmd.user)
cmd.errors.rejectValue('login', 'user.not.found')
}

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

关于unit-testing - Grails 1.3.5 Controller 测试空命令对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4087082/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com