내가 작성한 ASP.NET MVC 응용 프로그램에 단위 테스트를 추가하려고합니다. 내 단위 테스트에서 다음 코드를 사용합니다.
[TestMethod]
public void IndexAction_Should_Return_View() {
var controller = new MembershipController();
controller.SetFakeControllerContext("TestUser");
...
}
컨트롤러 컨텍스트를 조롱하는 다음 도우미를 사용하십시오.
public static class FakeControllerContext {
public static HttpContextBase FakeHttpContext(string username) {
var context = new Mock<HttpContextBase>();
context.SetupGet(ctx => ctx.Request.IsAuthenticated).Returns(!string.IsNullOrEmpty(username));
if (!string.IsNullOrEmpty(username))
context.SetupGet(ctx => ctx.User.Identity).Returns(FakeIdentity.CreateIdentity(username));
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller, string username = null) {
var httpContext = FakeHttpContext(username);
var context = new ControllerContext(new RequestContext(httpContext, new RouteData()), controller);
controller.ControllerContext = context;
}
}
이 테스트 클래스는 다음과 같은 기본 클래스에서 상속됩니다.
[TestInitialize]
public void Init() {
...
}
이 방법 내에서 다음 코드를 실행하려고하는 라이브러리 (제어 할 수없는)를 호출합니다.
HttpContext.Current.User.Identity.IsAuthenticated
이제 문제를 볼 수 있습니다. 컨트롤러에 대해 가짜 HttpContext를 설정했지만이 기본 Init 메소드에는 없습니다. 단위 테스트 / 조롱은 나에게 매우 새롭기 때문에 이것이 올바르게 이루어지고 싶습니다. 내 컨트롤러와 Init 메소드에서 호출되는 모든 라이브러리에서 HttpContext를 공유하도록 HttpContext를 모의하는 올바른 방법은 무엇입니까?