Tengo un controlador en C # usando el marco ASP.Net MVC
public class HomeController:Controller{
public ActionResult Index()
{
if (Request.IsAjaxRequest())
{
//do some ajaxy stuff
}
return View("Index");
}
}
Recibí algunos consejos sobre burlas y esperaba probar el código con lo siguiente y 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);
Sin embargo, sigo recibiendo este error:
Excepción System.ArgumentNullException: System.ArgumentNullException: el valor no puede ser nulo. Nombre del parámetro: solicitud en System.Web.Mvc.AjaxRequestExtensions.IsAjaxRequest (solicitud HttpRequestBase)
Dado que el Request
objeto en el controlador no tiene setter. Traté de hacer que esta prueba funcionara correctamente usando el código recomendado de una respuesta a continuación.
Esto usó Moq en lugar de RhinoMocks, y al usar Moq utilizo lo siguiente para la misma prueba:
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);
pero recibe el siguiente error:
Excepción System.ArgumentException: System.ArgumentException: Configuración no válida en un miembro no reemplazable: x => x.Headers ["X-Requested-With"] en Moq.Mock.ThrowIfCantOverride (Configuración de expresión, MethodInfo methodInfo)
De nuevo, parece que no puedo configurar el encabezado de la solicitud. ¿Cómo configuro este valor, en RhinoMocks o Moq?
Respuestas:
Usando Moq :
ACTUALIZADO:
Simulacro
Request.Headers["X-Requested-With"]
o enRequest["X-Requested-With"]
lugar deRequest.IsAjaxRequest()
.fuente
Para cualquiera que use NSubstitute, pude modificar las respuestas anteriores y hacer algo como esto ... (donde Detalles es el nombre del método de Acción en el controlador)
fuente
Aquí hay una solución de trabajo con RhinoMocks. Lo he basado en una solución Moq que encontré en http://thegrayzone.co.uk/blog/2010/03/mocking-request-isajaxrequest/
fuente
Es AjaxRequest es un método de extensión. Entonces puede hacerlo de la siguiente manera usando Rhino:
fuente
Parece que estás buscando esto,
Uso en el controlador:
fuente
Debe burlarse de HttpContextBase y ponerlo en su propiedad ControllerContext, así:
fuente
Para hacer
IsAjaxRequest()
que devuelva falso durante la prueba de la Unidad, debe configurar los Encabezados de solicitud, así como el valor de la solicitud de recopilación, tanto en su método de prueba como se indica a continuación:La razón para configurar ambos está oculta en la implementación de IsAjaxRequest () que se detalla a continuación:
Utiliza tanto la recopilación de solicitudes como el encabezado, es por eso que necesitamos crear una configuración para el encabezado y la recopilación de solicitudes.
esto hará que la solicitud devuelva falso cuando no sea una solicitud ajax. para que sea verdadero, puede hacer lo siguiente:
fuente
Encontré otra forma de agregar un objeto HttpRequestMessage en su solicitud durante la API web de la siguiente manera
fuente
(Un poco tarde para la fiesta pero fui por una ruta diferente, así que pensé en compartir)
Para buscar un código puro / una forma burlona de probar esto sin crear simulacros para las clases Http, implementé un IControllerHelper que tiene un método Initialise que toma la Solicitud como parámetro y luego expone las propiedades que quiero, por ejemplo:
Luego, en mi controlador, llamo initialise al comienzo del método:
Y luego mi código solo depende de dependencias burlables.
Para las pruebas funcionales, simplemente anulo el iControllerHelper en la composición para un sustituto.
fuente