좋아요, 단위 테스트에는 몇 가지 문제가 있습니다. 사용자가 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 인 것처럼 필요하지 않습니다. 두 번째 어설 션은 실패 할 것입니다.
항상 정확한 단위 테스트 이름을 제공하십시오. 정확한 테스트를 반영하십시오. 테스트 가독성과 유지 보수성이 향상됩니다.
좀 더 구체적으로 말씀해 주시겠습니까? 예를 들어, 지금까지 시도한 것은 무엇입니까? 테스트 코드는 무엇이며 테스트중인 코드는 어떻게 생겼습니까? 이를 통해 빠르고 정확한 답변을 얻을 수 있습니다. – Spock
본인의 질문에이 정보를 추가했습니다. –