मेरे पास ASP # MVC फ्रेमवर्क का उपयोग करके C # में एक नियंत्रक है
public class HomeController:Controller{
public ActionResult Index()
{
if (Request.IsAjaxRequest())
{
//do some ajaxy stuff
}
return View("Index");
}
}
मुझे मॉकिंग के बारे में कुछ सुझाव मिले और मैं निम्नलिखित और राइनोमॉक्स के साथ कोड का परीक्षण करने की उम्मीद कर रहा था
var mocks = new MockRepository();
var mockedhttpContext = mocks.DynamicMock<HttpContextBase>();
var mockedHttpRequest = mocks.DynamicMock<HttpRequestBase>();
SetupResult.For(mockedhttpContext.Request).Return(mockedHttpRequest);
var controller = new HomeController();
controller.ControllerContext = new ControllerContext(mockedhttpContext, new RouteData(), controller);
var result = controller.Index() as ViewResult;
Assert.AreEqual("About", result.ViewName);
हालाँकि मुझे यह त्रुटि मिलती रहती है:
अपवाद सिस्टम। अर्गमेंटनैन्यूसेप्शन: सिस्टेम।अर्गमेंटन्यूल्स अपवाद: मान शून्य नहीं हो सकता। पैरामीटर नाम: System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest (HttpRequestBase अनुरोध) पर अनुरोध
चूंकि Request
नियंत्रक पर ऑब्जेक्ट का कोई सेटर नहीं है। मैंने नीचे दिए गए उत्तर से अनुशंसित कोड का उपयोग करके इस परीक्षण को ठीक से काम करने की कोशिश की।
यह राइनोमॉक्स के बजाय Moq का उपयोग करता है, और Moq का उपयोग करने में मैं एक ही परीक्षण के लिए निम्नलिखित का उपयोग करता हूं:
var request = new Mock<HttpRequestBase>();
// Not working - IsAjaxRequest() is static extension method and cannot be mocked
// request.Setup(x => x.IsAjaxRequest()).Returns(true /* or false */);
// use this
request.SetupGet(x => x.Headers["X-Requested-With"]).Returns("XMLHttpRequest");
var context = new Mock<HttpContextBase>();
context.SetupGet(x => x.Request).Returns(request.Object);
var controller = new HomeController(Repository, LoginInfoProvider);
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
var result = controller.Index() as ViewResult;
Assert.AreEqual("About", result.ViewName);
लेकिन निम्न त्रुटि प्राप्त करें:
अपवाद सिस्टम। क्रैगमेंट एक्ससेप्शन: System.ArgumentException: गैर-अप्रतिबंधित सदस्य पर अमान्य सेटअप: x => x.Headers [Mo-.Mock.ThrowIcantOverride (अभिव्यक्ति सेटअप, MethodInfo methodInfo) में।
फिर, ऐसा लगता है कि मैं अनुरोध हेडर सेट नहीं कर सकता। मैं RhinoMocks या Moq में यह मान कैसे सेट करूं?