c# टेस्ट इनिट विधि में नकली HttpContext.Current




unit-testing mocking (4)

यदि आपका एप्लिकेशन तृतीय पक्ष आंतरिक रूप से रीडायरेक्ट करता है, तो नीचे दिए गए 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" } };

मैं एक एएसपी.नेट एमवीसी अनुप्रयोग में यूनिट परीक्षण जोड़ने की कोशिश कर रहा हूं जिसे मैंने बनाया है। मेरे यूनिट परीक्षणों में मैं निम्नलिखित कोड का उपयोग करता हूं:

[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 को मॉक करने के लिए मेरे लिए सही तरीका क्या है ताकि इसे मेरे नियंत्रक और किसी भी पुस्तकालय में साझा किया जा सके जिसे मेरी इनिट विधि में बुलाया जाता है।


HttpContext.Current System.Web.HttpContext का एक उदाहरण देता है, जो System.Web.HttpContextBase विस्तार नहीं करता है। HttpContextBase को बाद में जोड़ा गया ताकि HttpContext को नकली करना मुश्किल हो। दो वर्ग मूल रूप से असंबंधित हैं ( HttpContextWrapper उनके बीच एडाप्टर के रूप में उपयोग किया जाता है)।

सौभाग्य से, एचटीपीकॉन्टेक्स्ट खुद ही नकली है जो आपके लिए IIdentity (उपयोगकर्ता) और IIdentity

निम्न कोड कंसोल एप्लिकेशन में भी अपेक्षित के रूप में चलता है:

HttpContext.Current = new HttpContext(
    new HttpRequest("", "http://tempuri.org", ""),
    new HttpResponse(new StringWriter())
    );

// User is logged in
HttpContext.Current.User = new GenericPrincipal(
    new GenericIdentity("username"),
    new string[0]
    );

// User is logged out
HttpContext.Current.User = new GenericPrincipal(
    new GenericIdentity(String.Empty),
    new string[0]
    );

टेस्ट इनिट के नीचे भी काम करेगा।

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

मुझे पता है कि यह एक पुराना विषय है, हालांकि यूनिट परीक्षणों के लिए एक एमवीसी आवेदन मॉक करना कुछ ऐसा है जो हम नियमित आधार पर करते हैं।

मैं सिर्फ विजुअल स्टूडियो 2013 में अपग्रेड करने के बाद एमओसी 4 का उपयोग करके एमवीसी 3 एप्लिकेशन का मजाक कर अपने अनुभव जोड़ना चाहता था। यूनिट परीक्षणों में से कोई भी डीबग मोड में काम नहीं कर रहा था और एचटीपी कॉन्टेक्स्ट चर पर चरम पर देखने की कोशिश करते समय "अभिव्यक्ति का मूल्यांकन नहीं कर सका" दिखा रहा था ।

दृश्य स्टूडियो 2013 में कुछ ऑब्जेक्ट्स का मूल्यांकन करने के मुद्दे हैं। मैकगिंग मॉक किए गए वेब एप्लिकेशन को फिर से काम करने के लिए, मुझे टूल्स => विकल्प => डिबगिंग => सामान्य सेटिंग्स में "प्रबंधित संगतता मोड का उपयोग करें" को देखना था।

मैं आमतौर पर ऐसा कुछ करता हूं:

public static class FakeHttpContext
{
    public static void SetFakeContext(this Controller controller)
    {

        var httpContext = MakeFakeContext();
        ControllerContext context =
        new ControllerContext(
        new RequestContext(httpContext,
        new RouteData()), controller);
        controller.ControllerContext = context;
    }


    private static HttpContextBase MakeFakeContext()
    {
        var context = new Mock<HttpContextBase>();
        var request = new Mock<HttpRequestBase>();
        var response = new Mock<HttpResponseBase>();
        var session = new Mock<HttpSessionStateBase>();
        var server = new Mock<HttpServerUtilityBase>();
        var user = new Mock<IPrincipal>();
        var identity = new Mock<IIdentity>();

        context.Setup(c=> c.Request).Returns(request.Object);
        context.Setup(c=> c.Response).Returns(response.Object);
        context.Setup(c=> c.Session).Returns(session.Object);
        context.Setup(c=> c.Server).Returns(server.Object);
        context.Setup(c=> c.User).Returns(user.Object);
        user.Setup(c=> c.Identity).Returns(identity.Object);
        identity.Setup(i => i.IsAuthenticated).Returns(true);
        identity.Setup(i => i.Name).Returns("admin");

        return context.Object;
    }


}

और इस तरह के संदर्भ की शुरुआत

FakeHttpContext.SetFakeContext(moController);

और सीधे नियंत्रक में विधि को कॉलिंग

long lReportStatusID = -1;
var result = moController.CancelReport(lReportStatusID);






httpcontext