如何在Grails中测试会话变量?

时间:2013-12-16 18:15:36

标签: grails testing

我在测试Grails控制器时遇到两个问题。

我有一个控制器包含一些像这样的方法:

def save() {
    def x =session.SPRING_SECURITY_CONTEXT.authentication.principal.id
    def user = User.get(x)
}

为了测试这个,我写了这样的测试方法:

def testSave () {
    myCont.save()
}

当我运行这个时,我会在获取用户时从数据库中看到一个WARN:

[main] WARN core.DatastoreUtils - Cannot unbind session, there's no SessionHolder registered

所以,我的问题是:

  • 如何在测试时注入或初始化会话,以便我可以从会话中获取此用户?
  • 如何删除WARN消息?

3 个答案:

答案 0 :(得分:1)

如果您正在尝试对其进行单元测试并且只想将其删除(并且不使用任何具有更复杂的模拟/存根的东西),您可以使用地图快速轻松地完成它。将@TestFor(YourControllerClass)放在测试类声明的正上方。然后你可以做类似的事情:

controller.session.SPRING_SECURITY_CONTEXT = [authentication:[principal:[id: 'blah']]]

答案 1 :(得分:0)

您应该进行集成测试并自行设置会话,如here所示。

答案 2 :(得分:0)

你试过这个吗?

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

假设此控制器要测试

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)
  }

测试

测试会话和闪存值

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"]
} 

详细参考[1]:http://www.ibm.com/developerworks/java/library/j-grails10209/