[C#] 모의 HttpContext.Current 테스트 Init 메서드에서


Answers

아래 Test Init는 또한 일을 할 것입니다.

[TestInitialize]
public void TestInit()
{
  HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", null), new HttpResponse(null));
  YourControllerToBeTestedController = GetYourToBeTestedController();
}
Question

내가 만든 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 메서드에서는 설정하지 않았습니다. 단위 테스트 / 조롱은 나에게는 매우 새로운 것이므로이 권리를 얻고 싶습니다. HttpContext를 모의 해 내 컨트롤러와 내 Init 메서드에서 호출되는 모든 라이브러리에서 공유되도록 올바른 방법은 무엇입니까?




응용 프로그램 타사가 내부적으로 리디렉션하는 경우 HttpContext를 다음과 같이 조롱하는 것이 좋습니다.

HttpWorkerRequest initWorkerRequest = new SimpleWorkerRequest("","","","",new StringWriter(CultureInfo.InvariantCulture));
System.Web.HttpContext.Current = new HttpContext(initWorkerRequest);
System.Web.HttpContext.Current.Request.Browser = new HttpBrowserCapabilities();
System.Web.HttpContext.Current.Request.Browser.Capabilities = new Dictionary<string, string> { { "requiresPostRedirectionHandling", "false" } };