Как я могу протестировать ModelState?

Как проверить Controller.ViewData.ModelState? Я бы предпочел сделать это без макетов.

Ответ 1

Вам не нужно использовать Mock, если вы используете шаблон репозитория для своих данных, конечно.

Некоторые примеры: 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.");

Ответ 2

//[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);

Ответ 3

Для тестирования веб-API используйте метод Validate на контроллере:

var controller = new MyController();
controller.Configuration = new HttpConfiguration();
var model = new MyModel();

controller.Validate(model);
var result = controller.MyMethod(model);

Ответ 4

Добавляя к замечательным ответам выше, ознакомьтесь с этим фантастическим использованием защищенного метода TryValidateModel в классе Controller.

Просто создайте тестовый класс, наследующий от контроллера, и передайте свою модель методу TryValidateModel. Здесь ссылка: http://blog.icanmakethiswork.io/2013/03/unit-testing-modelstate.html

Полный кредит принадлежит Джону Райли и Марку Талари за это решение.