我怎么测试Controller.ViewData.ModelState
?我宁愿没有任何模拟框架.
当然,如果您正在为数据使用存储库模式,则不必使用模拟.
一些例子: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);
要测试Web API,请在控制器上使用Validate方法:
var controller = new MyController();
controller.Configuration = new HttpConfiguration();
var model = new MyModel();
controller.Validate(model);
var result = controller.MyMethod(model);
为.NetCore 2.1解决这个问题这是我的解决方案:
扩展方法
using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; namespace MyExtension { public static void BindViewModel(this Controller controller, T model) { if (model == null) return; var context = new ValidationContext(model, null, null); var results = new List (); if (!Validator.TryValidateObject(model, context, results, true)) { controller.ModelState.Clear(); foreach (ValidationResult result in results) { var key = result.MemberNames.FirstOrDefault() ?? ""; controller.ModelState.AddModelError(key, result.ErrorMessage); } } } }
查看模型
public class MyViewModel { [Required] public string Name { get; set; } }
单元测试
public async void MyUnitTest() { // helper method to create instance of the Controller var controller = this.CreateController(); var model = new MyViewModel { Name = null }; // here we call the extension method to validate the model // and set the errors to the Controller's ModelState controller.BindViewModel(model); var result = await controller.ActionName(model); Assert.NotNull(result); var viewResult = Assert.IsType(result); }