C# 测试覆盖的ValidationAttribute是否有效

C# 测试覆盖的ValidationAttribute是否有效,c#,asp.net-mvc,unit-testing,moq,validationattribute,C#,Asp.net Mvc,Unit Testing,Moq,Validationattribute,我在测试自定义验证属性时遇到了一些麻烦。当我在单元测试中调用IsValid方法时,由于方法签名是protected,我无法通过Mock对象,而是调用基本虚拟bool IsValid(对象值) 验证属性 protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var otherPropertyInfo = validationContext.Object

我在测试自定义验证属性时遇到了一些麻烦。当我在单元测试中调用
IsValid
方法时,由于方法签名是
protected
,我无法通过
Mock
对象,而是调用基本
虚拟bool IsValid(对象值)

验证属性

protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
    var otherPropertyInfo = validationContext.ObjectType.GetProperty(this.otherPropertyName);
    var otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);

    if (value != null)
    {
        if (otherPropertyValue == null)
        {
            return new ValidationResult(FormatErrorMessage(this.ErrorMessage));
        }
    }

    return ValidationResult.Success;
}
测试

[Test]
public void Should_BeValid_WhenPropertyIsNullAndOtherPropertyIsNull()
{
    var attribute = new OptionalIfAttribute("test");
    var result = attribute.IsValid(null);

    Assert.That(result, Is.True);
}
如果无法通过模拟验证上下文,那么如何正确测试该类?

您可以使用该类手动执行验证,而无需模拟任何内容。有一篇关于它的简短文章。我可能会这样做

[Test]
public void Should_BeValid_WhenPropertyIsNullAndOtherPropertyIsNull()
{
    var target = new ValidationTarget();
    var context = new ValidationContext(target);
    var results = new List<ValidationResult>();

    var isValid = Validator.TryValidateObject(target, context, results, true);

    Assert.That(isValid, Is.True);
}

private class ValidationTarget
{
    public string X { get; set; }

    [OptionalIf(nameof(X))]
    public string OptionalIfX { get; set; }
}
[测试]
当属性为Null且其他属性为Null()时,public void应为有效
{
var target=新的ValidationTarget();
var context=新的ValidationContext(目标);
var results=新列表();
var isValid=Validator.TryValidateObject(目标、上下文、结果、true);
Assert.That(isValid,Is.True);
}
私有类验证目标
{
公共字符串X{get;set;}
[选项F(名称(X))]
公共字符串OptionalFX{get;set;}
}

您可以选择对
结果进行断言

这实际上是我最后做的事情,但忘了在这里给出答案。您应该在Validator.TryValidateObject中设置validateAllProperties arg,否则它不会检查属性,var isValidate=Validator.TryValidateObject(目标、上下文、结果、true);谢谢@FeiyuZhou,如果没有validateAllProperties=true,它不会验证我的自定义属性,每次都返回IsValid=true。