2012-08-12 26 views
5

Buscando una manera de burlarse de la seguridad del muelle en algunas pruebas de unidad/integración.Mock Grails Spring Security Usuario registrado

  • Grails: v2.1.0
  • Spring Security Core: V1.2.7.3

controlador tiene la siguiente:

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

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

He intentado lo siguiente y varias otras maneras, pero no puedo ver para que funcione:

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

Parece que el usuario no se está creando y no puede obtener el principio.id. ¿Alguna sugerencia o mejores alternativas?

Respuesta

3

Creo que el usuario se acaba de crear, pero no se guarda, y es por eso que no tiene una ID.

La solución podría ser la siguiente:

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

Hay una alternativa:

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

que sugeriría un refactor a getLoggedInUser:

private getLoggedInUser(){ 
    return springSecurityService.currentUser 
} 

Con este cambio, se podría escribir :

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

¡Gracias por eso! :) – DanyZift

Cuestiones relacionadas