测试grails + acegi中的securityConfig映射

时间:2010-10-01 04:06:37

标签: unit-testing testing grails integration-testing spring-security

我正在编写一个仍然使用Acegi插件的项目的测试用例(不是更新的Spring Core Security插件),到目前为止,我已经设法做了这个网站(http://www.zorched.net/2008/09/01/grails-testing-acegi-security/

建议检测当前登录的用户。但是,在我的控制器中,我的内容看起来像这样:

def list = {
     // code for an "admin account"
}

def list_others = {
     // code for other accounts
}

现在,我检查登录用户的控制器。相反,我在SecurityConfig.groovy中定义了这些:

security {
     ...
     requestMapString = """\
          /someController/list=ROLE_ADMIN
          /someController/list_others=ROLE_OTHERS
     """
     ...
}

因此,如果我有一个看起来像这样的测试:

void testTrial() {
     // define here that otherUser has a role of ROLE_OTHERS

     authenticate(otherUser, "other") // this calls the authenticate methode in the site I gave earlier
     controller.list()

     // I do an assertion here to check where this goes to
}

事情是,当我做断言时,当然list会告诉我它转发到list.gsp ...即使“登录”用户的角色是ROLE_OTHERS而不是管理员。

但是,我需要的是如何测试登录用户应该访问的内容?在这种情况下,假设调用是* .list()并且登录用户具有ROLE_OTHERS角色,我应该被转发到“被拒绝”页面。

帮助?谢谢!

1 个答案:

答案 0 :(得分:1)

你需要进行功能测试。单元测试只是Groovy或Java类加上一些模拟。没有Spring应用程序上下文,没有Hibernate,没有数据库,最重要的是没有插件。

集成测试为您提供了更多功能,但即使这些请求主要是模拟的,因为没有容器,也没有过滤器触发。 Spring Security(Acegi插件使用的)基于一系列servlet过滤器。因此,如果您想测试正确应用安全规则,则需要运行服务器,因此需要进行功能测试。

功能测试有几种选择,最常用的是WebTest:http://grails.org/plugin/webtest,功能测试插件:http://grails.org/plugin/functional-test和Selenium RC插件:http://grails.org/plugin/selenium-rc

最新的是Geb:http://grails.org/plugin/geb。手册位于http://geb.codehaus.org/,最近有一篇博客文章写在这里:http://blog.springsource.com/2010/08/28/the-future-of-functional-web-testing/