在 grails 控制器中模拟命令对象导致 hasErrors() 无论如何都返回 false !请帮忙
Posted
技术标签:
【中文标题】在 grails 控制器中模拟命令对象导致 hasErrors() 无论如何都返回 false !请帮忙【英文标题】:mocking command object in grails controller results in hasErrors() return false no matter what! Please help 【发布时间】:2011-02-24 11:50:33 【问题描述】:我有一个控制器,它在控制器动作中使用命令对象。在 grails 的控制器单元测试中模拟此命令对象时,hasErrors() 方法总是返回 false,即使我故意违反其约束也是如此。更令人费解的是,在生产中,hasErrors() 有效!所以这只是一个测试问题。
def save = RegistrationForm form ->
if(form.hasErrors())
// code block never gets executed
else
// code block always gets executed
在测试本身中,我这样做:
mockCommandObject(RegistrationForm)
def form = new RegistrationForm(emailAddress: "ken.bad@gmail",
password: "secret", confirmPassword: "wrong")
controller.save(form)
我故意给它一个错误的电子邮件地址,并确保密码和 confirmPassword 属性不同。在这种情况下,hasErrors() 应该返回 true... 但它没有。如果这样一个基本的东西不起作用,我不知道我的测试如何可靠:/
这是 RegistrationForm 类,所以你可以看到我正在使用的约束:
class RegistrationForm
def springSecurityService
String emailAddress
String password
String confirmPassword
String getEncryptedPassword()
springSecurityService.encodePassword(password)
static constraints =
emailAddress(blank: false, email: true)
password(blank: false, minSize:4, maxSize: 10)
confirmPassword(blank: false, validator: confirmPassword, form ->
confirmPassword == form.password
)
【问题讨论】:
我搞定了。在将“表单”对象传递给被测操作之前,我必须调用 form.validate()。作为旁注......你在开玩笑吗?!说真的......在框架本身中,它会自动调用验证......但我必须在我的测试用例中这样做?这不能像在生产中那样工作吗?伙计,规则的一个又一个例外只是为了让它发挥作用。啊!在 Grails 中进行测试很糟糕。这是坏的。在原始 Spring 中更容易做到。 我遇到了同样的问题,我正在调用验证,正如您在评论中发布的那样,但后来找到了更好的方法。放入您的 setUp() mockCommandObject RegistrationForm 然后:RegistrationForm .metaClass.hasErrors() !delegate.validate() 并拆除:GroovySystem.metaClassRegistry.removeMetaClass RegistrationForm。 【参考方案1】:你试过mockForConstraintsTests
吗?
例如类似...
void testSomething()
mockForConstraintsTests(RegistrationForm)
def form = new RegistrationForm(emailAddress: "ken.bad@gmail", password: "secret", confirmPassword: "wrong")
form.validate()
assert 1 == form.errors.getErrorCount()
尝试在自己的单元测试中首先测试RegistrationForm
命令对象。 (获得一些对其实际工作的信心)
也许使用上述内容作为测试的基础会有所帮助!?!?
【讨论】:
mockForConstraintsTest() 似乎与 mockCommandObject 所做的差不多。如果我在测试的 setup() 中包含一个或两个,你的 testSomething() 似乎工作。只有当我不包括其中任何一个时它才会失败。既然是这种情况,其他使用 hasErrors() 的测试仍然没有返回 true :(以上是关于在 grails 控制器中模拟命令对象导致 hasErrors() 无论如何都返回 false !请帮忙的主要内容,如果未能解决你的问题,请参考以下文章
在过滤器中访问 request.JSON 后 Grails 2.5.0 控制器命令对象绑定