我在测试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
所以,我的问题是:
答案 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/