快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
基本类型的测试:单元测试和集成测试。这两者之间没有语法区别 — 它们都是用相同的断言写的 GroovyTestCase。它们的区别在于语义。单元测试孤立地测试类,而集成 测试在一个完整的运行环境中测试类。

坦白地说,如果您想将所有的 Grails 测试都编写成集成测试,则刚好符合我的想法。所有 Grails create-* 命令都生成相应的集成测试,所以很多人都使用现成的集成测试。正如稍后看到的一样,很多 测试需要在完整的运行环境中进行,因此默认使用集成测试是很好的选择。

如果您想测试一些非核心 Grails 类,则适合使用单元测试。要创建一个单元测试,请输入 grails create-unit-test MyTestUnit。因为测试脚本不是在不同的包中创建的,所以单元测试和集成测试的名 称应该是惟一的。如果不是这样的话,将会收到清单 7 所示的错误消息:

清单 7. 单元测试和集成测试同名时收到的错误消息

The sources /src/trip-planner2/test/integration/HotelStayTests.groovy and   /src/trip-planner2/test/unit/HotelStayTests.groovy are   containing both a class of the name HotelStayTests. @ line 3, column 1.   class HotelStayTests extends GroovyTestCase {   ^ 1 error

因为集成测试默认使用后缀 Tests,所以我在所有单元测试上都使用后缀 UnitTests,避免混淆。

为简单的验证错误消息编写测试

下一个用户场景说明 hotel 字段不能留空。这很容易通过内置的 Grails 验证框架来实现。将一个 static constraints 块添加到 HotelStay,如清单 8 所示:

清单 8. 将一个 static constraints 块添加到 HotelStay

class HotelStay {   static constraints = {    hotel(blank:false)    checkIn()    checkOut()   }   String hotel   Date checkIn   Date checkOut   //the rest of the class remains the same }

输入 grails run-app。如果您尝试在留空 hotel 字段的情况下创建一个 HotelStay,将收到如图 6 所示的错误消息:

图 6. 空字段的默认错误消息

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

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

时间:2011-07-29 IBM Scott Davis

我敢保证您的用户会喜欢这个特性,但对默认的错误消息还不是很满意。假设他们稍微改动了一下用 户场景:hotel 字段不能留空;如果留空,错误消息会提示 “Please provide a hotel name”。

现在您已经添加了一些定制代码 — 尽管它就像一个定制的 String 那么简单 — 接下来应该添加测 试了(当然,编写一个验证用户场景的完整性的测试 — 尽管不涉及到定制代码 — 也是完全可以接受的 。

打开 grails-app/i18n/messages.properties 并添加 hotelStay.hotel.blank=Please provide a hotel name。尝试在浏览器中提交一个空 hotel。这时您将看到自己的定制消息,如图 7 所示:

图 7. 显示定制的验证错误消息

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

向 HotelStayTests.groovy 添加一个新测试,检验对空字段的验证是否有效,如清单 9 所示:

清单 9. 测试验证错误

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 ()   }   //the rest of the tests remain unchanged }

在生成的控制器中,您已经看到添加到域类中的 save() 方法。在这里,我本来也可以调用 save(), 但事实上我并不想把新的类保存到数据库。我只关注验证是否发生。由 validate() 方法来完成这个任务 。如果验证失败,则返回 false。如验证成功,则返回

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