2008-11-13 4 views

ответ

41

Вам не нужно использовать 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."); 
+1

Виртуальный модификатор на ошибках был бы неплохим, увы, есть налог на организацию, который выглядит немного тяжелым для меня. – 2012-02-09 11:45:29

+0

IMHO Лучшее решение - использовать транспортер mvc. Таким образом, вы получаете более реалистичное поведение вашего контроллера, вы должны доставить проверку модели на ее судьбу - проверку атрибутов. В приведенном ниже описании описывается это (http://stackoverflow.com/a/5580363/572612). – 2012-08-03 07:11:38

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

Мне очень нравится этот метод. Как вы заявляете, гораздо лучше при правильной проверке модели, которая была украшена атрибутами проверки. – stevethethread 2013-02-28 15:01:04

0

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

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

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

10

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

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

controller.Validate(model); 
var result = controller.MyMethod(model); 
Смежные вопросы