Ho un controller in C # usando il framework ASP.Net MVC
public class HomeController:Controller{
public ActionResult Index()
{
if (Request.IsAjaxRequest())
{
//do some ajaxy stuff
}
return View("Index");
}
}
Ho avuto alcuni consigli sul deridere e speravo di testare il codice con il seguente e RhinoMocks
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);
Tuttavia continuo a ricevere questo errore:
Eccezione System.ArgumentNullException: System.ArgumentNullException: il valore non può essere nullo. Nome parametro: richiesta su System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest (richiesta HttpRequestBase)
Poiché l' Request
oggetto sul controller non ha setter. Ho provato a far funzionare correttamente questo test utilizzando il codice consigliato da una risposta di seguito.
Questo ha usato Moq invece di RhinoMocks e, usando Moq, utilizzo lo stesso per lo stesso test:
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);
ma ottieni il seguente errore:
Eccezione System.ArgumentException: System.ArgumentException: installazione non valida su un membro non sostituibile: x => x.Headers ["X-Requested-With"] su Moq.Mock.ThrowIfCantOverride (Setup espressione, MethodInfo methodInfo)
Ancora una volta, sembra che non sia possibile impostare l'intestazione della richiesta. Come posso impostare questo valore, in RhinoMocks o Moq?