मैं एक 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 सेट किया है लेकिन इस बेस इनिट विधि में नहीं। यूनिट परीक्षण / मॉकिंग मेरे लिए बहुत नया है इसलिए मैं यह सुनिश्चित करना चाहता हूं कि मुझे यह अधिकार मिले। मेरे लिए HttpContext को मॉक करने का सही तरीका क्या है ताकि इसे मेरे नियंत्रक और किसी भी लाइब्रेरी में साझा किया जाए जिसे मेरे इनिट विधि में कहा जाता है।