3

TestMethod에서 컨트롤러 인스턴스를 만들 때 내 mvc4 응용 프로그램에서 Windows 인증을 사용하지 않으면 컨트롤러가 User 객체를 읽지 않으면 사용자 객체가 null로 유지됩니다. 그래서 내 검사는 실패합니다. 나는 그들이 일하도록하기 위해 무엇을 할 수 있습니까?MVC4 유닛 테스트 및 windows 인증

추가 정보 : 이 내 테스트입니다 :

[TestMethod] 
public void Create() 
{ 
    var ctrl = new LanguageController(); 
    var res = ctrl.Manage() as ViewResult; 
    Assert.IsNotNull(res); 
    Assert.AreEqual(res.ViewName, "Create"); 
} 

그리고 내 LanguageController는 기본 클래스가 있습니다

그 안에 내가하여 사용자 권한을 발견하려고 생성자를 가지고
public class LanguageController : MyController 
{ 

외부 권리 관리자.

public class MyController : Controller 
    { 
    protected Rights rm; 
    public MyController() 
    { 
     this.rm = RightManager.Discover(User.Identity); 
    } 

여기서이 생성자에서 나는 User가 null임을 알았습니다.

+0

좀 더 구체적으로 말씀해 주시겠습니까? 예를 들어, 지금까지 시도한 것은 무엇입니까? 테스트 코드는 무엇이며 테스트중인 코드는 어떻게 생겼습니까? 이를 통해 빠르고 정확한 답변을 얻을 수 있습니다. – Spock

+0

본인의 질문에이 정보를 추가했습니다. –

답변

2

좋아요, 단위 테스트에는 몇 가지 문제가 있습니다. 사용자가 null 인 이유를 설명 할 때 확인해 보겠습니다.

단순히 사용자 (IPrincipal) 인스턴스의 스텁 된 버전을 제공하지 않았기 때문입니다. 컨트롤러에 주입하는 방법을 찾아야합니다. 컨트롤러에서 의존성을 외부화하는 것이 중요합니다. 그래야 깨끗한 컨트롤러가 작동하지 않을뿐만 아니라 testability을 중요하게 홍보 할 수 있습니다.

다음과 같이 종속성을 삽입하십시오. 이것은 나에게 가짜 사용자도 가짜 마우스 오른쪽 관리자를 주입 할 수있는 기능을 제공

귀하의 SUT (테스트에서 시스템)

public class MyController : Controller 
{ 
    protected Rights rm; 
    public MyController(IPrincipal user, IRightManager rightManager) 
    { 
     this.rm = rightManager.Discover(user.Identity); 
    } 
} 

public class LanguageController : MyController 
{ 
    public LanguageController(IPrincipal user, IRightManager rightManager) 
     : base(user, rightManager) 
    { 
    } 

    public ActionResult Manage() 
    { 
     return View("Manage"); 
    } 
} 

.

그렇다면 런타임에 응용 프로그램을 실행할 때 실제 User, RightManager를 얻으시겠습니까?

컨트롤러 작성 중에 inject the dependencies to the Controller을 사용할 수 있습니다.

프레임 워크 dependency injection (이상적으로는)을 사용하지 않으면 수동으로 종속성을 주입 할 수 있습니다. 예를 들어, 컨트롤러에 속성을 만들고 컨트롤러에 실제 인스턴스를 주입하고 단위 테스트 시간에 가짜 인스턴스를 주입합니다. 조금씩 어긋나 기 때문에 자세하게 설명하지는 않겠지 만, 너무 많이 찾을 수 있습니다 이 측면에 관한 질문/웹 참조.

단위 테스트 이제 단위 테스트에서 종속성을 주입 할 수있는 방법이 생겼습니다. Isolation framework (AKA 및 Mock 객체 프레임 워크)을 사용하거나 이전 학교 방법으로 삽입 할 수 있습니다. 손으로 쓰는 가짜/가짜/스텁입니다. 격리 프레임 워크를 사용하는 것이 좋습니다. 수동 가짜를 만들면 불필요한 코드 중복 및 유지 관리 문제가 발생합니다. 내가 선호하는 프레임 워크를 모르기 때문에 필자는 필기 가짜/가짜/스텁을 거의 만들지 않았습니다.

public class FakeRightManager : IRightManager { 
    public Rights Discover(IIdentity identity) { 
     return new Rights(); 
    } 
} 

public class MyFakeIdentity : IIdentity { 
    public string AuthenticationType { 
     get { throw new NotImplementedException(); } 
    } 

    public bool IsAuthenticated { 
     get { throw new NotImplementedException(); } 
    } 

    public string Name { 
     get { throw new NotImplementedException(); } 
    } 
} 

public class MyFakePrincipal : IPrincipal { 
    public IIdentity Identity { 
     get { return new MyFakeIdentity(); } 
    } 

    public bool IsInRole(string role) { 
     throw new NotImplementedException(); 
    } 
} 

당신 단위 테스트 : 테스트 당신이 어설 확인에

[TestMethod] 
    public void ManageAction_Execute_ReturnsViewNameManager() 
    { 
     var fakeUser = new MyFakePrincipal(); 
     var fakeRightManager = new FakeRightManager(); 
     var ctrl = new LanguageController(fakeUser, fakeRightManager); 

     var res = ctrl.Manage() as ViewResult; 

     Assert.AreEqual<string>(res.ViewName, "Manage"); 
    } 

.IsNotNull (res); 이것은 res가 null 인 것처럼 필요하지 않습니다. 두 번째 어설 션은 실패 할 것입니다.

항상 정확한 단위 테스트 이름을 제공하십시오. 정확한 테스트를 반영하십시오. 테스트 가독성과 유지 보수성이 향상됩니다.