framework - Unidad de prueba de carpetas de modelos personalizados en ASP.NET MVC 2
mvc pdf (2)
Escribí el archivador de modelos personalizado en el proyecto, que usa ASP.NET MVC 2. Este enlazador de modelos vincula solo 2 campos del modelo:
public class TaskFormBinder : DefaultModelBinder
{
protected override void BindProperty(ControllerContext controllerContext,
ModelBindingContext bindingContext,
PropertyDescriptor propertyDescriptor)
{
if (propertyDescriptor.Name == "Type")
{
var value = bindingContext.ValueProvider.GetValue("Type");
var typeId = value.ConvertTo(typeof(int));
TaskType foundedType;
using (var nhSession = Domain.GetSession())
{
foundedType = nhSession.Get<TaskType>(typeId);
}
if (foundedType != null)
{
SetProperty(controllerContext, bindingContext, propertyDescriptor, foundedType);
}
else
{
AddModelBindError(bindingContext, propertyDescriptor);
}
return;
}
if (propertyDescriptor.Name == "Priority")
{ /* Other field binding ... */
return;
}
base.BindProperty(controllerContext, bindingContext, propertyDescriptor);
}
}
¿Cómo puedo probar este cuaderno de modelos utilizando la prueba de unidades VS standart? Pasé algunas horas buscando en Google, encuentra ejemplos de parejas ( http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx ), pero estos ejemplos son para MVC1 y no funcionan cuando se utiliza MVC2.
Aprecio tu ayuda.
El enfoque general es crear un ControllerContext simulado, un ModelBindingContext simulado y un PropertyDescriptor simulado, y luego llamar al método.
Si la carpeta de su modelo usa otros servicios, lo que parece que el suyo hace (¿está usando NHibernate?), Entonces tendrá que abstraerse de esos y proporcionarles también simulacros.
El código de prueba de la unidad se verá así:
// Arrange
ControllerContext mockControllerContext = ...;
ModelBindingContext mockModelBindingContext = ...;
PropertyDescriptor mockPropertyDescriptor = ...;
SomeService mockService = ...;
TaskFormBinder taskFormBinder = new TaskFormBinder();
taskFormBinder.Service = mockService;
// Act
taskFormBinder.BindProperty(
mockControllerContext, mockModelBindingContext, mockPropertyDescriptor);
// Assert
// ... here you need to inspect the values in the model binding context to see that it set the right properties
¿Qué problema (s) tienes al escribir la prueba de unidad?
He modificado http://www.hanselman.com/blog/SplittingDateTimeUnitTestingASPNETMVCCustomModelBinders.aspx para probar los modelos de carpetas de ASP.Net MVC 2 ...
[Test]
public void Date_Can_Be_Pulled_Via_Provided_Month_Day_Year()
{
// Arrange
var formCollection = new NameValueCollection {
{ "foo.month", "2" },
{ "foo.day", "12" },
{ "foo.year", "1964" }
};
var valueProvider = new NameValueCollectionValueProvider(formCollection, null);
var modelMetadata = ModelMetadataProviders.Current.GetMetadataForType(null, typeof(FwpUser));
var bindingContext = new ModelBindingContext
{
ModelName = "foo",
ValueProvider = valueProvider,
ModelMetadata = modelMetadata
};
DateAndTimeModelBinder b = new DateAndTimeModelBinder { Month = "month", Day = "day", Year = "year" };
ControllerContext controllerContext = new ControllerContext();
// Act
DateTime result = (DateTime)b.BindModel(controllerContext, bindingContext);
// Assert
Assert.AreEqual(DateTime.Parse("1964-02-12 12:00:00 am"), result);
}