C# 嵌套视图模型不';t使用DataAnnotation从.net中的单元测试进行验证
我有一个C# 嵌套视图模型不';t使用DataAnnotation从.net中的单元测试进行验证,c#,.net,validation,unit-testing,data-annotations,C#,.net,Validation,Unit Testing,Data Annotations,我有一个ApiController,其中有一个接受VariableTemplateViewModel的Post方法,如下所示: public class VariableTemplateViewModel { public VariableTemplateViewModel() { } public double Version { get; set; } [Required] public List<VariableViewModel> Vari
ApiController
,其中有一个接受VariableTemplateViewModel
的Post方法,如下所示:
public class VariableTemplateViewModel
{
public VariableTemplateViewModel() { }
public double Version { get; set; }
[Required]
public List<VariableViewModel> Variables { get; set; }
}
public class VariableViewModel
{
public VariableViewModel() { }
[Required(AllowEmptyStrings=false, ErrorMessage="Variable Name cannot be empty")]
public string Name { get; set; }
}
这非常有效,如果我使用在变量
列表中有空名称
字段的视图模型调用它,则验证失败。但是,当我试图从单元测试中验证它时,它只在VariableViewModel
本身上运行验证,而不是递归地在VariableViewModel
上运行验证。因此,如果我为变量
传入null
,我会得到一个验证错误,但是如果我为名称
传入一个空字符串,则没有验证错误
[TestMethod]
public void Post_Returns_HttpResponseException_With_Empty_Variable_Name()
{
var controller = new VariableController();
var viewModel = new VariableTemplateViewModel
{
Version = 1,
Variables = new List<VariableViewModel>
{
new VariableViewModel { Name = "" }
}
};
var validationContext = new ValidationContext(viewModel, null, null);
var validationResults = new List<ValidationResult>();
Validator.TryValidateObject(viewModel, validationContext, validationResults, true);
foreach (var validationResult in validationResults)
{
controller.ModelState.AddModelError(validationResult.MemberNames.First(), validationResult.ErrorMessage);
}
// Assert
}
[TestMethod]
public void Post_返回带有_Empty_变量_Name()的_HttpResponseException_
{
var控制器=新的VariableController();
var viewModel=新变量templateviewmodel
{
版本=1,
变量=新列表
{
新变量ViewModel{Name=”“}
}
};
var validationContext=新的validationContext(viewModel,null,null);
var validationResults=新列表();
TryValidateObject(viewModel,validationContext,validationResults,true);
foreach(validationResults中的var validationResult)
{
controller.ModelState.AddModelError(validationResult.MemberNames.First(),validationResult.ErrorMessage);
}
//断言
}
我在VariableTemplateViewModel
构造函数中删除/添加空构造函数并初始化变量。我甚至尝试在viewModel.Variables
上直接使用Validator.TryValidateObject
,但都没有效果
有人知道如何解决这个问题吗?我也有同样的问题,可以用这个来解决。愿这对你有帮助
public void Post(long id, [FromBody]VariableTemplateViewModel model)
{
if (!ModelState.IsValid && TryValidateModel(model.NestedModel, "NestedModel."))
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
}
试试这个,嘿,谢谢你的回答。然而,在我的例子中,验证在
Post
方法中运行良好。问题在于单元测试。由于您无法通过调用Post直接从单元测试调用验证,因此我在TestMethod
中使用了Validator.TryValidateObject
,这就是它无法验证嵌套模型的原因。请尝试使用更新的链接,我刚刚尝试过。从测试方法来看仍然不起作用:(我最终使用的方法正是我想要的。
public void Post(long id, [FromBody]VariableTemplateViewModel model)
{
if (!ModelState.IsValid && TryValidateModel(model.NestedModel, "NestedModel."))
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
}