快速业务通道

精通Grails - 使用Grails进行单元测试(单元测试提速) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
-------------------------------------------------- Tests PASSED - view reports in  /testing/test/reports.

精通Grails - 使用Grails进行单元测试(单元测试提速)(4)

时间:2010-12-03 IBM Scott Davis

要进一步细化单元测试,您可以断言验证会因为特定字段上的特定约束而失 败,如清单 8 所示。mockForConstraintsTests() 方法将 errors 集合元编程 到域类上。此 errors 集合简化了对是否触发了正确的约束的验证。

清单 8. 断言特定字段上的一个特定约束违规

void testBlank()  {   mockForConstraintsTests(User)   def user = new User()   assertFalse user.validate()   println "=" * 20   println "Total number of errors:"   println user.errors.errorCount   println "=" * 20   println "Here are all of the errors:"   println user.errors   println "=" * 20   println "Here are the errors individually:"   user.errors.allErrors.each{    println it    println "-" * 20   }   assertEquals "blank", user.errors["name"] }

重新运行此测试。它还会意外地失败吗?查看报告输入(如图 3 所示),找 出问题根源:

图 3. 用空值替代空格导致的失败

错误消息为 expected:<[blank]> but was:<[nullable]>。验 证失败了,但原因并不是您所期望的那样。

很容易遇到这种错误。在 Grails 中,默认情况下,域类中的所有字段必须 非空。这项隐含限制的问题在于,您通常会通过 HTML 表单与 Grails 交互。如 果在 HTML 表单中将 String 字段保留为空,paramsMap 中的控制器会将其看作 空 String(也就是 ""),而不是 null。

如果单击 HTML 报告底部的 System.out 链接,可以看到 3 个 String 字段 (name、login 和 password)都抛出了 nullable 约束违规错误。图 4 显示了 println 调用的输出。只有 role 字段 — 其默认值为 user — 通过隐含的 nullable 约束。

图 4. 测试的 System.out 输出

精通Grails - 使用Grails进行单元测试(单元测试提速)(5)

时间:2010-12-03 IBM Scott Davis

再次调整 testBlank() 测试,确保验证因合适的原因而失败(从而使单元测 试通过),如清单 9 所示:

清单 9. 测试现在因正确的原因得以通过

void testBlank()  {   mockForConstraintsTests(User)   def user = new User(name:"",             login:"admin",             password:"wordpass")   assertFalse user.validate()   assertEquals 1, user.errors.errorCount   assertEquals "blank", user.errors["name"] }

在重新运行测试以确保其通过时,可以解决一个稍微棘手一些的约束: unique。

使用 mockForConstraintsTests() 测试 unique 约束

在上一节已经看到,可以在隔离环境中轻松执行对他多数约束的测试。例如 ,测试 password 字段的 minSize 至少为 5 非常简单,因为它只依赖于字段本 身的值。清单 10 给出了 testPassword() 方法:

清单 10. 测试 minSize 约束

void testPassword() {   mockForConstraintsTests(User)   def user = new User(password:"foo")   assertFalse user.validate()   assertEquals "minSize", user.errors["password"] }

但是如何测试 unique 这样的约束呢?这种约束确保数据库表不包含重复值 。幸运的是

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号