2012-08-12 7 views
5

いくつかのユニット/統合テストでは、春のセキュリティを模擬する方法を探しています。Mock Grails Springセキュリティログインユーザ

  • のGrails:V2.1.0
  • 春のセキュリティのコア: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.... 

ユーザーは作成されておらず、原理を取得できません.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

関連する問題