Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 嵌套视图模型不';t使用DataAnnotation从.net中的单元测试进行验证_C#_.net_Validation_Unit Testing_Data Annotations - Fatal编程技术网

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);
    }   
}