2012-08-12 128 views
5

寻找一种方法来模拟某些单元/集成测试中的弹簧安全性。模拟Grails Spring Security登录用户

  • 的Grails:V2.1.0
  • Spring Security的核心:V1.2.7.3

控制器有以下几点:

//some action 
def index(){ 
    def user = getLoggedInUser() 
    render .... 
}... 

private getLoggedInUser(){ 
    return User.get(springSecurityService.principal.id) 
} 

我尝试了以下等各种方式,但不能看到得到它的工作:

void testSomething(){ 
    def dc = new SomeController() 
    dc.springSecurityService = [ 
      encodePassword: 'password', 
      reauthenticate: { String u -> true}, 
      loggedIn: true, 
      principal: [username:"Bob"]] 
    dc.index() ... assertion.... 

似乎用户没有得到创建,不能得到principle.id。任何建议或更好的选择?

回答

3

我认为用户刚刚创建,但没有保存,这就是为什么它没有ID。

的解决办法是这样的:

void testSomething(){ 
    def dc = new SomeController() 
    def loggedInUser = new User(username: "Bob").save() // This way the user will have an ID 
    dc.springSecurityService = [ 
     encodePassword: 'password', 
     reauthenticate: { String u -> true}, 
     loggedIn: true, 
     principal: loggedInUser] 
    dc.index() ... assertion.... 

有一种替代方案:

void testSomething(){ 
    def dc = new SomeController() 
    def loggedInUser = new User(...).save() 
    dc.metaClass.getLoggedInUser = { loggedInUser } 
... 

我会建议一个重构到getLoggedInUser:

private getLoggedInUser(){ 
    return springSecurityService.currentUser 
} 

随着这一变化,你可以写:

void testSomething(){ 
    def dc = new SomeController() 
    def loggedInUser = new User(...).save() 
    dc.springSecurityService = [ 
     encodePassword: 'password', 
     reauthenticate: { String u -> true}, 
     loggedIn: true, 
     getCurrenUser: { loggedInUser }] 
... 
+0

干杯。 :) – DanyZift 2012-08-13 09:01:31

相关问题