第一的; 我知道我不需要测试 MVC 的内部,但我真的需要一个套件来测试流入我们系统的数据。
我希望在不模拟所有 HTTP 上下文的情况下如何测试 objectA(表单集合、字典、集合、对象等)是否符合 objectAModel?
我不想实例化我的控制器或调用动作。我只是想测试我的新对象是否使模型状态无效。
我希望我可以简单地写
var modelState = new ModelBindingContext<objectAModel>().validate(objectA);
第一的; 我知道我不需要测试 MVC 的内部,但我真的需要一个套件来测试流入我们系统的数据。
我希望在不模拟所有 HTTP 上下文的情况下如何测试 objectA(表单集合、字典、集合、对象等)是否符合 objectAModel?
我不想实例化我的控制器或调用动作。我只是想测试我的新对象是否使模型状态无效。
我希望我可以简单地写
var modelState = new ModelBindingContext<objectAModel>().validate(objectA);
Brad Wilson在 DataAnnotations 上发表了一篇出色的文章
我如何测试它?
为您的模型使用 DataAnnotations 属性将验证从控制器操作移到模型绑定器中,这意味着您对控制器操作的单元测试将被简化。
当您为此编写测试时,您需要验证三件事:
- DataAnnotationsModelBinder 是否注册为默认活页夹?您只需对整个应用程序执行一次,就像您要编写的路由测试一样。
- 我的模型是否使用 DataAnnotations 属性正确装饰?您最终将为添加到模型中的每个验证属性编写测试。
- 当模型状态无效时,我的操作方法是否正确反应?您只需为每个操作方法编写一次。
非常简单,您可以实现一个方法,ModelMetadata
为您的模型类型提取 ,获取ModelValidator
并验证模型对象。
public bool IsModelValid<T>(T model) where T : class
{
var metaData = ModelMetadataProviders.Current.GetMetadataForType(() => model, typeof(T));
var validator = ModelValidator.GetModelValidator(metaData, new ControllerContext());
var validationResults = validator.Validate(model);
return 0 == validationResults.Count();
}
通过“简单”,我的意思是这不一定会考虑所有可能的配置,但您可以对模型的有效性进行基本检查。