嵌套视图模型不能通过.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,但无济于事。

有谁知道这是如何修复的吗?

嵌套视图模型不能通过.net中使用DataAnnotations进行单元测试验证

我有一个相同的问题,并使用此解决方案。希望这对你有帮助。

public void Post(long id, [FromBody]VariableTemplateViewModel model)
{
    if (!ModelState.IsValid && TryValidateModel(model.NestedModel, "NestedModel."))
    {
        throw new HttpResponseException(HttpStatusCode.BadRequest);
    }   
}

试试这个,使用DataAnnotations递归验证