2014-12-09 3 views
-1

'LoginController'에 'passwordActive'작업에 대한 단위 테스트 케이스를 작성하려고했습니다. 그러나 나는 모든 것을 조롱 당하고 그것을 어떻게 할 지 확신하지 못합니다.Grails의 Unit 테스트 케이스에서 메소드를 조롱했습니다.

def passwordActive={ 
     log.error("Entering into Password Active") 
     println "Password Active -- Params = "+params 

     String contextPath = request.contextPath 
     String username = null    
     User user = null 

    try{ 

      if (params.username != null && params.username.trim().length() > 0) { 
      username = params.username 
      user = User.findByUsername(username) 
      } 

      if (user == null) { 
       log.error("USER not found.")     
       flash.errorLogin = "Username is incorrect" 
       redirect(action:"auth") 
       return   
      }else if(user.password != params.password){ 
       log.error("USER password is wrong..") 
       flash.errorLogin = "Please enter valid password.." 
       redirect(action:"auth") 
       return 
      }else if (!user.active) { 
       log.error("USER is inactive.")    
       flash.errorLogin = "User in Inactive" 
       redirect(action:"auth") 
       return   
      } 

      session["userid"] = user.id 

      String userRole = user.authority.authority 
      String url = contextPath + "/" + userRole   
      println "URL = "+url     
      redirect(url: url, method: 'post', params: params)  
      return 
     } 
     catch(Exception e){ 
     println e.printStackTrace() 
     } 

    log.error("Exit into Password Active") 

    } 

사용자 이름이없는 테스트 사례를 작성하고 싶습니다. 이 경우 플래시 메시지에 "username incorrect"라는 메시지가 있어야하며이를 주장 할 수 있습니다. 여기 모든 것을 조롱해야하고 어떻게해야하는지. 작은 예제로 작업을 설명해 주시겠습니까? (위의 코드와 관련하여 선호하면 이해하기 쉽습니다)

답변

0

보안 구현을 작성하는 것은 대단히 나쁜 생각입니다. 스프링 보안 플러그인이 교육적인 목적으로 어떻게 사용되는지 살펴보고 플러그인을 사용하는 것이 좋습니다.이 플러그인은 성숙하고 유연하며 설정하기 쉽습니다.

교육적인 목적을 위해 Spring Security가 수행하는 방식에 따라 느슨하게 접근하는 방법을 사용하여 코드 위를 조롱 할 수있는 방법을 살펴 보겠습니다. 컨트롤러를 의미하지 않으므로 사용자 조회를 서비스/bean으로 이동합니다. 비즈니스 로직을 포함해야합니다. 말 같은 것을 :

class UserProviderService { 
    User findUser(String username) { 
     User.findByUsername(username) 
    } 
} 

당신은 예를 들어, 당신이 다음 자신의 함수를 호출 할 것이다에 종속 (def userProviderService)로 주입 할 컨트롤러에서 userProviderService.findUser(username). 정상 작동 중에 Grails는 컨트롤러에 UserProviderService을 주입 할 것입니다. 그러나 유닛 테스트에서는 원하는대로 모의 실험을 할 수 있습니다 (예 : controller.userProviderService = [ findByUsername: { -> return null } ]).

비밀번호 비교와 비슷합니다. 암호 해시, 비교 등을 구현하는 passwordService을 사용하면 모든 테스트가 끝나기 전에 응답을 조롱 할 수 있습니다. 보안에 신경 쓰고 다시 엉망이되기 쉽다면이 내용은 사소하지 않습니다.하지 마세요. 자신!

당신이 당신의 코드를 구성하는 방법은 그것을 테스트하는 것입니다 얼마나 쉽게 또는 하드 결정한다. 물론 당신은 User.metaclass 엉망 재정의 방법은 왼쪽과 수 그 접근법은 대개 매우 깨지기 쉽다. 코드를 분할함으로써 인생을 더 쉽게 만들 수 있습니다! 테스트 할 수 있도록 코드를 구조화하는 방법은 확실히 경험으로 배우는 것이므로 계속 생각해보십시오!

+0

다음과 같이 서비스 클래스에서 메소드를 조롱하려고했습니다. 하지만 작동하지 데프 userService controller.userService = 새로운 UserService() controller.userService = [passwordComplexityCheck은 : {데프 K-> 반환 사실 }] 다음은 내 서비스 클래스 UserService 클래스는 { // 필요 선언 입니다 ........ public boolean passwordComplexityCheck (String password) {return true}} –

+0

어떤 방식으로 작동하지 않습니까? 실제 메서드가 호출되는지 또는 어떤 종류의 예외가 발생합니까? 그렇다면 예외는 무엇입니까? –

관련 문제