快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
er(suziq)   assertFalse adminService.restartServer(jdoe) }

这一次,与预期的一样,测试通过了。所有日志输出都被发送到 System.out 。请记住,您可以在 HTML 报告中看到此输出。

理解 ControllerUnitTestCase

使用 GrailsUnitTestCase,可以轻松测试域类和服务,但测试控制器还需要 其他一些功能。ControllerUnitTestCase 扩展了 GrailsUnitTestCase,所以您 仍然可以像以前一样使用 mockForConstraintsTests()、mockDomain() 和 mockLogging()。而且 ControllerUnitTestCase 为您正在测试的控制器创建一 个新实例,并将其存储在名为 controller 的变量中。这个 controller 变量可 用于在测试期间以编程方式与控制器交互。

要更好地理解核心控制器的功能,在命令提示符处键入 grails generate- controller User。这将 def scaffold = true 替换为控制器代码的完全实现。

在完全实现的 grails-app/controllers/UserController.groovy 文件中, 您可以看到,调用 index 操作会重定向到 list 操作,如清单 18 所示:

清单 18. UserController 中默认的 index 操作

class  UserController {    def index = { redirect(action:list,params:params) } }

要验证是否按预期发生了重定向,将一个 testIndex() 方法添加到 test/unit/UserControllerTests.groovy,如清单 19 所示:

清单 19. 测试默认的 index 操作

import  grails.test.* class UserControllerTests extends ControllerUnitTestCase {    void testIndex() {     controller.index()     assertEquals controller.list, controller.redirectArgs ["action"]    } }

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

时间:2010-12-03 IBM Scott Davis

可以看到,您首先调用控制器操作,就像它是另一个控制器上的方法一样。 redirect 参数存储一个名为 redirectArgs 的 Map 中。断言验证 action 键是 否包含 list 值。(如果操作以一个 render 结束,那么您可以根据名为 renderArgs 的 Map 进行断言)。

现在假设 index 操作稍微先进一些。它检查一个 User 的会话并根据用户是 否为 admin 来重定向会话。在 ControllerUnitTestCase 中,session 和 flash 都是 Map,您可以在调用或调用之后的断言之前对它们进行填充。更改 index 操作,如清单 20 所示:

清单 20. 更加先进的 index 操作

def index = {   if(session?.user?.role == "admin"){    redirect(action:list,params:params)   }else{    flash.message = "Sorry, you are not authorized to view  this list."    redirect(controller:"home", action:index)   } }

要测试这项新功能,更改 UserControllerTests.groovy 中的 testIndex() 方法,如清单 21 所示:

清单 21. 测试 session 和 flash 值

void testIndex() {   def jdoe = new User(name:"John Doe", role:"user")   def suziq = new User(name:"Suzi Q", role:"admin")   controller.session.user = jdoe   controller.index()   assertEquals "home", controller.redirectArgs["controller"]   assertTrue controller.flash.message.startsWith("Sorry")   controller.session.user = suziq    controller.index()   assertEquals controller.list, controller.redirectArgs ["action"] }

一些控制器操作需要传入参数。在 ControllerUnitTestCase 中,您可以将 值添加到 params Map 中,就像

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