[c#] 在測試初始方法中模擬HttpContext.Current



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" } };





Related