2013-12-16 24 views
4

我有兩個測試Grails控制器的問題。如何在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消息?
+0

你是否試要單元測試嗎?哪個版本的Grails? – 2013-12-16 21:05:35

回答

0

如果您正在嘗試單元測試,並希望將其存儲(並且不使用任何具有更復雜嘲弄/存根的任何內容),則可以使用地圖快速輕鬆地完成此操作。將@TestFor(YourControllerClass)置於測試類聲明的正上方。然後你可以做類似的事情:

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

您應該執行集成測試並自行設置會話,如here所示。

+0

鏈接已損壞 – stenix

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/

相關問題