[英]Mock Grails Spring Security Logged in User
在某些單元/集成測試中尋找模擬彈簧安全性的方法。
控制器具有以下功能:
// 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....
看來用戶沒有被創建,也無法獲得principal.id
。 有什么建議或更好的選擇嗎?
我認為用戶只是在創建,而沒有保存,這就是為什么它沒有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 }]
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.