2012-08-12 14 views
5

Szukasz sposobu na pozorowanie bezpieczeństwa wiosennego w niektórych testach jednostkowych/integracyjnych.Mock Grails Spring Security Użytkownik zalogowany

  • Grails: v2.1.0
  • Wiosna Bezpieczeństwo Rdzeń: V1.2.7.3

Kontroler posiada następujące:

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

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

Próbowałem następujące i różne inne sposoby, ale Nie mogę go zobaczyć, aby uruchomić:

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

Wygląda na to, że użytkownik nie jest tworzony i nie może uzyskać pliku rule.id. Wszelkie sugestie lub lepsze alternatywy?

Odpowiedz

3

Myślę, że użytkownik jest właśnie tworzony, ale nie zapisany, i dlatego nie ma identyfikatora.

Rozwiązaniem mogłoby być tak:

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

Istnieje alternatywa:

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

Proponuję Refactor do getLoggedInUser:

private getLoggedInUser(){ 
    return springSecurityService.currentUser 
} 

Dzięki tej zmianie można napisać :

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

Wiwaty za to. :) – DanyZift

Powiązane problemy