c# - example - security asp net mvc
¿Cómo puedo probar ModelState? (4)
¿Cómo puedo probar Controller.ViewData.ModelState
? Preferiría hacerlo sin ningún marco simulado.
No es necesario utilizar un simulacro si está utilizando el patrón de repositorio para sus datos, por supuesto.
Algunos ejemplos: http://www.singingeels.com/Articles/Test_Driven_Development_with_ASPNET_MVC.aspx
// Test for required "FirstName".
controller.ViewData.ModelState.Clear();
newCustomer = new Customer
{
FirstName = "",
LastName = "Smith",
Zip = "34275",
};
controller.Create(newCustomer);
// Make sure that our validation found the error!
Assert.IsTrue(controller.ViewData.ModelState.Count == 1,
"FirstName must be required.");
//[Required]
//public string Name { get; set; }
//[Required]
//public string Description { get; set; }
ProductModelEdit model = new ProductModelEdit() ;
//Init ModelState
var modelBinder = new ModelBindingContext()
{
ModelMetadata = ModelMetadataProviders.Current.GetMetadataForType(
() => model, model.GetType()),
ValueProvider=new NameValueCollectionValueProvider(
new NameValueCollection(), CultureInfo.InvariantCulture)
};
var binder=new DefaultModelBinder().BindModel(
new ControllerContext(),modelBinder );
ProductController.ModelState.Clear();
ProductController.ModelState.Merge(modelBinder.ModelState);
ViewResult result = (ViewResult)ProductController.CreateProduct(null,model);
Assert.IsTrue(result.ViewData.ModelState["Name"].Errors.Count > 0);
Assert.True(result.ViewData.ModelState["Description"].Errors.Count > 0);
Assert.True(!result.ViewData.ModelState.IsValid);
Además de las excelentes respuestas anteriores, consulte este fantástico uso del método TryValidateModel protegido dentro de la clase Controller.
Simplemente cree una clase de prueba que hereda del controlador y pase su modelo al método TryValidateModel. Aquí está el enlace: http://blog.icanmakethiswork.io/2013/03/unit-testing-modelstate.html
Todo el mérito recae en John Reilly y Marc Talary por esta solución.
Para probar la API web, use el método Validar en el controlador:
var controller = new MyController();
controller.Configuration = new HttpConfiguration();
var model = new MyModel();
controller.Validate(model);
var result = controller.MyMethod(model);