C# .NET:Validator.TryValidateObject - 在单元测试中返回 false,但在库中返回 true

问题描述 投票:0回答:1

我有一个班级,其财产全部装饰完毕:

public class AClass 
{
    [DisplayName("A Property")]
    [Phone]
    [MinLength(10)]
    [MaxLength(10)]
    [RegexStringValidator("[0-9]{10}")]
    public string AProperty { get; set; }
}

我的另一个班级有

List<T>
这些班级:

public class AnOuterClass
{
    [Required]
    public string SomeOtherValidatableProperty { get; set; }
    
    public List<AClass> SomeClasses { get; set; }
}

当我运行单元测试来自行验证内部类时,验证按预期工作:

[Test]
public void ErrorIfValueTooShort()
{
    var model = new AClass() { AProperty = "123456" };    
    var validationCtxt = new ValidationContext(model);
    var results = new List<ValidationResult>();
    var isValid = Validator.TryValidateObject(model, validationCtxt, results, true);
    Assert.That(isValid, Is.False);
}

但在实践中(即在单元测试之外),验证会以某种方式失败。这是我的代码的样子:

public bool IsValidModel(AnOuterClass model)
{
    var validationCtxt = new ValidationContext(model);
    var results = new List<ValidationResult>();
    var isValid = Validator.TryValidateObject(model, validationCtxt, results, true);

    if (isValid)
    {
        foreach (var innerModel in model.SomeClasses)
        {
            var innerValidationContext = new ValidationContext(innerModel);
            isValid = Validator.TryValidateObject(innerModel, innerValidationContext, results, true);
            if (!isValid)
                break;
        }
    }

    return isValid;
}

外层模型有效,但内层模型不有效;无论我在那里输入什么值,它都会返回

IsValid
为 true。为什么会这样?

我的单元测试是在 .NET 6 中进行的,但此代码所在的库是 .NET Standard 2.0。这会是一个问题吗?

c# .net validation nunit
1个回答
0
投票

在 .NET Fiddle 上测试,似乎运行良好。

https://dotnetfiddle.net/qvAlE1

我建议您使用调试器并查看 foreach 是否确实正在运行。也许模型列表中根本没有 AClass?

© www.soinside.com 2019 - 2024. All rights reserved.