2012-08-12 1 views
5

Alla ricerca di un modo per deridere sicurezza primavera in alcuni test di unità/integrazione.Mock Grails Spring Security Utente registrato

  • Grails: v2.1.0
  • Primavera di sicurezza Nucleo: V1.2.7.3

controller ha il seguente:

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

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

Ho provato quanto segue e vari altri modi, ma Non vedo come farlo funzionare:

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

Sembra che l'utente non venga creato e non possa ottenere il principio.id. Qualche suggerimento o alternative migliori?

risposta

3

Penso che l'utente sia appena stato creato, ma non salvato, ed è per questo che non ha un ID.

La soluzione potrebbe essere questa:

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.... 

C'è un'alternativa:

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

vorrei suggerire un refactoring per getLoggedInUser:

private getLoggedInUser(){ 
    return springSecurityService.currentUser 
} 

Con questa modifica, si potrebbe scrivere :

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

Cheers per quello. :) – DanyZift