He intentado por un tiempo escribir una prueba unitaria para un UserViewControl en ASP.NET MVC. Me gustaría llegar a código que se ve algo como esto:¿Cómo puedo probar la unidad de un MVC UserViewControl?
[TestMethod]
public void HaveControlToDisplayThings()
{
var listControl = new ControlUnderTest();
var viewData = new ViewDataDictionary<IList<string>>(this.repo.GetMeSomeData());
// Set up a ViewContext using Moq.
listControl.SetFakeViewContext(viewData);
listControl.ViewData = viewData;
listControl.RenderView(listControl.ViewContext);
// Never got this far, no idea if this will work :)
string s = listControl.ViewContext.HttpContext.Response.Output.ToString();
Assert.AreNotEqual(0, s.Length);
foreach (var item in this.repo.GetMeSomeData())
{
Assert.IsTrue(s.IndexOf(item) != -1);
}
}
Desafortunadamente, no importa lo que intente tengo errores desde el fondo de RenderView. Esto es causado (hasta donde puedo decir) por el objeto estático HttpContext.Current siendo inútil - Obtuve NullReferenceException
s desde System.Web.UI.Page.SetIntrinsics
.
He intentado utilizar de HttpSimulator que me dio un objeto HttpContext Phil Haack pero he encontrado también que necesitaba para especificar un HttpBrowserCapabilities
objeto falsa para obtener un poco más lejos:
Subtext.TestLibrary.HttpSimulator simulator = new HttpSimulator();
simulator.SimulateRequest();
var browserMock = new Mock<HttpBrowserCapabilities>();
browserMock.Expect(b => b.PreferredRenderingMime).Returns("text/html");
browserMock.Expect(b => b.PreferredResponseEncoding).Returns("UTF-8");
browserMock.Expect(b => b.PreferredRequestEncoding).Returns("UTF-8");
HttpContext.Current.Request.Browser = browserMock.Object;
ahora consigo excepciones en la propiedad de accesos en ese objeto . Me burlé de todos los que pude, pero parecía que no estaba llegando a ninguna parte rápidamente.
¿Alguien ha logrado que esto funcione?
Dejé de probar las unidades de la vista hace mucho tiempo. Intente mover cualquier lógica de negocio que tenga a los controladores y, en su lugar, realice una prueba en la unidad. Las vistas son notoriamente complejas para las pruebas unitarias. Podría haber una respuesta real, pero dejé de hacerlo hace un tiempo porque nuestros puntos de vista evolucionan demasiado rápido. – CVertex
Sí, en general no quiero probar mis vistas, pero cuando uso un Control de usuario, esta es una pieza reutilizable que a menudo se usa en toda la aplicación y no tiene un código de controlador para hablar. Quiero probar que puede ser instanciado y procesado y contiene aproximadamente lo correcto. –
Por lo que puedo entender, en realidad está probando repo.GetMeSomeData() que no depende un poco de la vista o el control del usuario. ¿Puedes simplemente verificar si repo.GetMeSomeData() te da lo que quieres y no invoca el control? – Graviton