嵌套视图模型不能通过.net中使用DataAnnotations进行单元测试验证
本文关键字:DataAnnotations 验证 单元测试 模型 视图 不能 net 嵌套 | 更新日期: 2023-09-27 18:03:46
我有一个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; }
}
在Post
方法中,我做了一个验证检查,如下所示:
public void Post(long id, [FromBody]VariableTemplateViewModel model)
{
if (!ModelState.IsValid )
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
}
这工作得很好,如果我用在Variables
列表中具有空Name
字段的视图模型调用它,则验证失败。然而,当我试图从单元测试中验证这一点时,它只在VariableViewModel
本身上运行验证,而不是递归地运行VariableViewModel
。所以,如果我在Variables
传递null
,我得到一个验证错误,但如果我在Name
传递一个空字符串,没有验证错误。
[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
}
我已经尝试删除/添加空构造函数和初始化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);
}
}
试试这个,使用DataAnnotations递归验证