2017-05-15 12 views
0

사용자 정의 authorizizeize 속성을 작성했으며 작성한 코드를 유닛 테스트하고 싶지만 지금 찾고있는 코드를 찾을 수 없습니다. 예를 들어 유닛 테스트 사용자 정의 권한 부여 속성

, 이쪽은 내 사용자 지정 권한 부여 속성 클래스입니다 :

using System.Collections.Generic; 
using System.IdentityModel.Tokens.Jwt; 
using System.Linq; 
using System.Security.Claims; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Security; 
using IPD2.MVC.Interfaces.Providers; 
using IPD2.MVC.Providers; 

namespace IPD2.MVC.Attribute 
{ 
    public class ClaimsAuthorizeAttribute : AuthorizeAttribute 
    { 
     private readonly string _claimValue; 
     private readonly string _claimType; 
     private readonly ITokenProvider _tokenProvider; 

     public ClaimsAuthorizeAttribute(string type, string value) 
     { 
      _claimType = type; 
      _claimValue = value; 
      _tokenProvider = new TokenProvider(); 
     } 

     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      var jwt = _tokenProvider.ApiToken as JwtSecurityToken; 
      if (jwt == null) 
      { 
       HandleUnauthorizedRequest(filterContext); 
      } 
      else 
      { 
       var claim = jwt.Claims.FirstOrDefault(expr => expr.Value == _claimValue); 
       var authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName]; 
       if (authCookie != null) 
       { 
        var formsAuthenticationTicket = FormsAuthentication.Decrypt(authCookie.Value); 
        if (formsAuthenticationTicket != null && !formsAuthenticationTicket.Expired) 
        { 
         var roles = formsAuthenticationTicket.UserData.Split(','); 
         HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(new FormsIdentity(formsAuthenticationTicket), roles); 
        } 
       } 

       if (claim != null) 
       { 
        base.OnAuthorization(filterContext); 
       } 
       else 
       { 
        HandleUnauthorizedRequest(filterContext); 
       } 
      } 

     } 
    } 
} 

내가하지만 난 해요 SpecsFor BDD 프레임 워크이 기본 테스트 클래스를 작성했습니다

public class GivenCallingClaimAuthorizationAttribute : SpecsFor<ClaimsAuthorizeAttribute> 
    { 
     //HttpActionContext actionContext; 
     //IPrincipal originalPrincipal; 

     protected override void Given() 
     { 

      SUT = new ClaimsAuthorizeAttribute(ClaimTypes.Role, "ImNotAllowedToUseController :("); 

     } 

     public class WhenUserIsNotAllowedToAccessController : GivenCallingClaimAuthorizationAttribute 
     { 
      protected override void When() 
      { 
       SUT.OnAuthorization(
        new AuthorizationContext() 
       ); 
      } 
     } 

     [Test] 
     public void ThenAssertSomethingBasedOnCodeInTest() 
     { 
      //todo: some assert 
     } 
    } 

테스트 코드 그것을 성공적으로 테스트하기 위해 무엇이 필요한지 확실하지 않습니다.

테스트 방법에 대한 아이디어가 있으십니까? 보시다시피, 저는 속성을 가진 컨트롤러가 아닌 클래스 자체를 테스트하고 있습니다. 나는 이것을 테스트하는 좋은 방법에 대해 확신하지 못한다.

답변

0

BDD를 수행하려는 경우 클래스의 동작을 생각해보십시오. 어떤 일을해야합니까? 예를 들어

, 아마도 그것은해야합니다 - 등

의 우리가 보는거야 가정 해 봅시다 - 올바른 역할 로 지정 권한이 부여 된 사용자 - 필터 티켓 만료 된 사용자 - 현재 사용자에게 권한을 부여 그 중 두 번째는 흥미 롭기 때문입니다. 나는 너에게 물어볼 것이다. "티켓이 만료 될 때의 예를 들어 줄 수 있니?"

당신은 "예, 제한 시간은 500ms이므로 그보다 오래된 것이 만료되었습니다."라고 말합니다. 또는 "축구 경기 티켓이며 매년 제공됩니다." (I 티켓이 무엇인지 모르겠지만,이 대화는 내가 그것을 해결 도움이 될 것이다.)

를 그럼 우리가 예를 쓸 수 있습니다 : 나는에 의견이 넣어 좋아

Given we've got a handler for unauthorized tickets 
Given Fred's ticket expired on 2017-05-14 
And it's now 2017-05-14 
When we try to authenticate Fred 
Then Fred should not be authenticated 
And the handler should be given Fred's details 

다음을 코드의 "should"를 테스트 제목으로 사용하십시오. 그 후에, (Given에서) 컨텍스트를 설정하고, 코드를 실행하여 (When) 운동 결과 (Then)를 검증하는 것입니다.

그러나 스펙 프레임 워크 은 하나만 주어진 것을 허용합니다.! 다른 컨텍스트가 필요한 몇 가지 시나리오를 이미 확인 했으므로별로 좋지 않습니다. SpecsFor를 사용하는 경우, 각 시나리오에 대해 하나의 클래스를 만들어야하며, 읽기가 쉽지 않을 것입니다.

대신 두 번째 스타일을 사용하고 Given, When, Then의 댓글로 시작하는 것이 좋습니다.

사실, 단위 테스트의 단계는 실제로 전체 시스템 BDD 시나리오와 비교하여 많이 재사용되지 않습니다. 전체 시스템 BDD 시나리오에서는 여러 가지 기능에 대해 컨텍스트가 여러 번 호출되는 경우가 많습니다. 코드 단위 (또는 클래스)는 하나의 책임을 완수하는 경향이 있거나 그렇지 않은 경우 리팩터링되며 해당 문맥은 다른 클래스로 유출되지 않습니다.

그래서 저는 Given, When, Then의 주석으로 충분하다는 것을 알았습니다.

따라서이 페이지 (아래쪽 아래)에서 볼 수있는 "오래된 학교"방식으로 전환하고 의견으로 시작하는 것이 좋습니다. 그것이 당신을 위해 어떻게되는지보십시오.

그런데 실제로 BDD를 올바르게 수행하려는 경우 드라이브의 동작을 예제로 개발하고 점진적으로 코드를 작성하여 코드를 작성하는 대신 작동 시키십시오 하위. 책 "Growing Object Oriented Software, Guided By Tests"은 매우 유용 할 것입니다.