new net mvc error danger asp addmodelerror asp.net-mvc-3

asp.net-mvc-3 - net - validation summary



El controlador de prueba ASP MVC 3 llama a ModelState.IsValid siempre devuelve true (2)

Tengo una aplicación ASP MVC 3 y en mi Modelo he implementado IValidatableObject.

Cuando mi controlador publica para crear o editar, obviamente solo quiero guardar el modelo si es válido.

Veo muchos blogs y publicaciones y respuestas que dicen algo así como

if(!ModelState.IsValid) { return View(); }

Mi pregunta. ¿Por qué es que ModelState.IsValid siempre se cumple en una prueba unitaria en el controlador?

Ejemplo:

[Test] public void InValidModelsAreNotAdded() { var invalidModel = new MyModel() { SomeField = "some data", SomeOtherField = "" }; var result = _controller.Submit(invalidModel); _repository.AssertWasNotCalled(r => r.Add(Arg.Is.Anything)); }

Código de modelo:

public class MyModel : IValidatableObject { public string SomeField { get; set; } public string SomeOtherField { get; set; } public IEnumerable Validate(ValidationContext validationContext) { if(string.IsNullOrWhiteSpace(SomeOtherField)) { yield return new ValidationResult("Oops invalid.", new[] {"SomeOtherField"}); } } }

AssertWasNotCalled siempre falla esta prueba.

Pasé por la prueba y noté que el ModelState.IsValid es verdadero para esta prueba. Es como si el IValidatableObject.Validate no se esté invocando. Parece que funciona cuando ejecuto el proyecto, pero no es una buena forma de probar una aplicación.

Además, me doy cuenta de que podría usar el atributo [Required] para mi ejemplo, pero mi código real tiene una validación mucho más compleja.

¿Pensamientos?


Bueno, instado de simular el comportamiento de enlace modelo puede hacer eso:

public class YourController : Controller { //some code public ViewResult someAction(Model model) { try { ValidateModel(model); } catch { // deal with errors } } //some code }

ValidateModel con bloques "try catch catch" es mucho más legible para mí. Pero todavía puedes usar bloques "if" con el método TryValidateModel

¡¡Espero que ayude!!


Es verdad porque no has llamado nada que lo haga falso.

Esto suele suceder durante el enlace, pero como acaba de pasar el modelo directamente en la prueba, se omitirá por completo.

Si está intentando probar la validación, hágalo directamente. Si está intentando probar la ruta de error en su controlador, la _controller.ModelState.AddModelError( //... su prueba puede llamar a _controller.ModelState.AddModelError( //...