2012-08-12 1 views
5

Suchen Sie nach einer Möglichkeit, Frühling Sicherheit in einigen Einheit/Integration Tests zu verspotten.Mock Grails Spring Security Angemeldete Benutzer

  • Grails: V2.1.0
  • Spring Security Kern: V1.2.7.3

Controller verfügt über die folgenden:

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

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

ich folgende und verschiedene andere Weise versucht, aber kann nicht sehen, um es zur Arbeit zu bringen:

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

Es scheint, dass der Benutzer nicht erstellt wird und die principle.id nicht bekommen kann. Irgendwelche Vorschläge oder bessere Alternativen?

Antwort

3

Ich denke, der Benutzer wird gerade erstellt, aber nicht gespeichert, und deshalb hat es keine 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.... 

Es gibt eine Alternative:

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

würde ich vorschlagen, ein Refactoring zu getLoggedInUser:

Die Lösung dieses sein könnte

private getLoggedInUser(){ 
    return springSecurityService.currentUser 
} 

Mit dieser Änderung könnten Sie schreiben :

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

Prost für das. :) – DanyZift