快速业务通道

精通Grails: 测试 Grails 应用程序 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
true。

hasErrors() 是另一个很有价值的测试方法。在调用 save() 或 validate() 之后,hasErrors() 允 许您查看验证错误。

清单 10 是经过扩展的 testBlankHotel(),它引入了其他一些很有用的验证方法:

清单 10. 验证错误的高级测试

class HotelStayTests extends GroovyTestCase {   void testBlankHotel(){   def h = new HotelStay(hotel:"")   assertFalse "there should be errors", h.validate()   assertTrue "another way to check for errors after you call validate()", h.hasErrors()    println "\nErrors:"   println h.errors ?: "no errors found"    def badField = h.errors.getFieldError(''hotel'')   println "\nBadField:"   println badField ?: "hotel wasn''t a bad field"   assertNotNull "I''m expecting to find an error on the hotel field", badField   def code = badField?.codes.find {it == ''hotelStay.hotel.blank''}   println "\nCode:"   println code ?: "the blank hotel code wasn''t found"   assertNotNull "the blank hotel field should be the culprit", code   } }

精通Grails: 测试 Grails 应用程序(8)

时间:2011-07-29 IBM Scott Davis

确定类没有通过验证之后,您可以调用 getErrors() 方法(在这里,借助 Groovy 简洁的 getter 语 法,它被缩略为 errors),返回一个 org.springframework.validation.BeanPropertyBindingResult。 就像 GORM 与 Hibernate 相比是一个瘦 Groovy 层一样,Grails 验证只不过是一个简单的 Spring 验证 。

调用 println 的结果不会在命令行上显示,但它们出现在 HTML 报告中,如图 8 所示:

图 8. 查看测试的 println 输出

精通Grails: 测试 Grails 应用程序 - 编程入门网

在 HotelStayTests 报告的右下角单击 System.out 链接。

清单 10 中给人亲切感觉的 Elvis 操作符(转过脸来 — 看见他向后梳起的发型和那双眼睛吗?)是 一个缩略的 Groovy 三元操作符。如果 ?: 左边的对象为 null,将使用右边的值。

将 hotel 字段更改为 "Holiday Inn" 并重新运行测试。您将在 HTML 报告中看到另一个 Elvis 输出 ,如图 9 所示:

图 9. 测试输出中的 Elvis

精通Grails: 测试 Grails 应用程序 - 编程入门网

看见 Elvis 之后,不要忘记清空 hotel 字段 — 如果您不希望留下中断的测试的话。

如果仍然显示关于 checkIn 和 checkOut 的验证错误,您不必担心。就这个测试而言,您完全可以忽 略它们。但是这表明您不应该仅测试错误是否出现 — 您应该确保特定的 错误被抛出。

注意,我没有断言定制错误消息的确切文本。为什么我上一次关注匹配的字符串(测试 toString 的 输出时)而这一次没有关注?toString 方法的定制输出便是上一个测试的目的。这一次,我更关心的是 确定验证代码的执行,而不是 Grails 是否正确呈现消息。这表明测试更像一门艺术,而不是科学(如果 我想验证准确的消息输出,则应该使用 Web 层测试工具,比如 Canoo WebTest 或 ThoughtWorks Selenium)。

精通Grails: 测试 Grails 应用程序(9)

时间:2011-07-29 IBM Scott Davis

创建和测试定制验证

现在,应该处理下一个用户场景了。您需要确保 checkOut 日期发生在 checkIn 日期之后。要解决这 个问题,您需要编写一个定制验证。编写完之后,要验证它。

将清单 11 中的定制验证代码添加到 static constraints 块:

清单 11. 一个定制的验证

class HotelStay {   static constraints = {    hotel(blank:false)    checkIn()    checkOut(validator:{val, obj->     ret

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号