测试覆盖 IsValid 的验证属性

本文关键字:属性 验证 IsValid 测试覆盖 | 更新日期: 2023-09-27 18:30:19

我在测试自定义验证属性时遇到了一些麻烦。由于在单元测试中调用 IsValid 方法时protected方法签名,因此我无法传入Mock<ValidationContext>对象,而是调用基virtual bool IsValid(object value)

验证属性

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

如果我无法在模拟验证上下文中传递,那么如何正确测试此类?

测试覆盖 IsValid 的验证属性

您可以使用

Validator 类手动执行验证,而无需模拟任何内容。这里有一篇关于它的简短文章。我可能会做类似的事情

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

您可以选择对results 进行断言。