He escrito algunos archivos de carpetas personalizados (que implementan IModelBinder) en nuestra aplicación ASP.NET MVC. Me pregunto ¿cuál es un buen enfoque para probarlos (carpetas)?Cómo probar Carpetas de modelo personalizadas en ASP.NET MVC?
Respuesta
lo hice de esta manera:
var formElements = new NameValueCollection() { {"FirstName","Bubba"}, {"MiddleName", ""}, {"LastName", "Gump"} };
var fakeController = GetControllerContext(formElements);
var valueProvider = new Mock<IValueProvider>();
var bindingContext = new ModelBindingContext(fakeController, valueProvider.Object, typeof(Guid), null, null, null, null);
private static ControllerContext GetControllerContext(NameValueCollection form) {
Mock<HttpRequestBase> mockRequest = new Mock<HttpRequestBase>();
mockRequest.Expect(r => r.Form).Returns(form);
Mock<HttpContextBase> mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.Expect(c => c.Request).Returns(mockRequest.Object);
return new ControllerContext(mockHttpContext.Object, new RouteData(), new Mock<ControllerBase>().Object);
}
Y entonces me acaba de pasar en la variable BindingContext al método bindModel del objeto que implementa la interfaz IModelBinder.
Aquí está una manera simple sin burla que escribí para ti en mi blog suponiendo que el uso del ValueProvider y no HttpContext: http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx
[TestMethod]
public void DateTime_Can_Be_Pulled_Via_Provided_Month_Day_Year_Hour_Minute_Second_Alternate_Names()
{
var dict = new ValueProviderDictionary(null) {
{ "foo.month1", new ValueProviderResult("2","2",null) },
{ "foo.day1", new ValueProviderResult("12", "12", null) },
{ "foo.year1", new ValueProviderResult("1964", "1964", null) },
{ "foo.hour1", new ValueProviderResult("13","13",null) },
{ "foo.minute1", new ValueProviderResult("44", "44", null) },
{ "foo.second1", new ValueProviderResult("01", "01", null) }
};
var bindingContext = new ModelBindingContext() { ModelName = "foo", ValueProvider = dict };
DateAndTimeModelBinder b = new DateAndTimeModelBinder() { Month = "month1", Day = "day1", Year = "year1", Hour = "hour1", Minute = "minute1", Second = "second1" };
DateTime result = (DateTime)b.BindModel(null, bindingContext);
Assert.AreEqual(DateTime.Parse("1964-02-12 13:44:01"), result);
}
Aquí está la [actualización MVC 2 de esta respuesta] (http://stackoverflow.com/questions/1992629/unit-testing-custom-model-binder-in-asp-net-mvc-2/2310954#2310954) para cualquier persona quien termina aquí antes de que lo encuentren – patridge
dict podría ser reprogramado como esto
FormCollection form = new FormCollection
{
{ "month1", "2" },
{ "day1", "12" },
{ "year1", "1964" },
{ "hour1", "13" },
{ "minute1", "44" },
{ "second1", "01" }
};
var bindingContext = new ModelBindingContext() { ModelName = "foo", ValueProvider = form.ToValueProvider() };
- 1. ¿Cómo puedo eliminar cadenas mágicas de carpetas de modelo personalizadas?
- 2. Anotaciones de datos personalizadas ASP.NET MVC C#
- 3. ASP.net mvc 2 carpeta de carpetas estructura
- 4. Cómo probar un equipo Asp.net MVC fileUpload
- 5. asp.net mvc Cómo probar los controladores correctamente
- 6. ASP.NET MVC estructura de carpetas y NuGet
- 7. Advertencias de modelo en ASP.NET MVC
- 8. ¿Cómo probar filtros de acción en ASP.NET MVC?
- 9. ASP.NET MVC Redirigir con modelo
- 10. Ruta de MVC de ASP.NET personalizada en carpetas anidadas
- 11. ASP.NET MVC - Múltiples modelos en carpetas de formularios y modelos
- 12. Encuadernación ASP.NET MVC Modelo en una lista
- 13. ¿Las clases personalizadas de ayuda HTML violan el modelo ASP.NET MVC?
- 14. Prueba del enlace del modelo en ASP.NET MVC 2
- 15. ¿Cómo puedo probar un filtro ActionFilter personalizado en ASP.Net MVC
- 16. ¿cómo se organiza el código de modelo en asp.net-mvc?
- 17. lista de ASP.NET MVC modelo de unión
- 18. Unidad modelo personalizado de pruebas aglutinante en ASP.NET MVC 2
- 19. Protección de carpetas en MVC
- 20. ASP.NET MVC NHibernate modelo de unión
- 21. ASP.NET MVC modelo de vista y DropDownList
- 22. Plantillas T4 personalizadas de ASP.NET MVC para vistas
- 23. Cómo actualizar el modelo complejo en ASP.NET MVC 3
- 24. cómo acceder a la sesión en el modelo asp.net mvc
- 25. ASP.NET MVC: enrutamiento de babosas personalizadas sin afectar el rendimiento
- 26. Asp.net MVC Modelo para ver y diseño
- 27. ASP.Net MVC con servicio web como modelo?
- 28. ¿Cómo probar las etiquetas de plantilla personalizadas en Django?
- 29. matriz de vinculación de ASP.NET MVC en el modelo
- 30. ¿Por qué ResolveBundleUrl no funciona para carpetas personalizadas? (MVC Beta 4)
El contructor la sobrecarga utilizada para ModelBindingContext no parece existir. –
Sí, solo uso el constructor sin parámetros y luego llamo a BindModel directamente con el ControllerContext falso. Parece que funciona hasta ahora. –