c# - 测试覆盖 IsValid 的 ValidationAttribute

标签 c# asp.net-mvc unit-testing moq validationattribute

我在测试自定义验证属性时遇到了一些麻烦。由于方法签名是 protected当我调用 IsValid在我的单元测试中,我无法传入 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);
}

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

最佳答案

您可以使用 Validator类来手动执行验证,而无需模拟任何东西。上面有一篇简短的文章here .我可能会做类似的事情

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

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

关于c# - 测试覆盖 IsValid 的 ValidationAttribute,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34765859/

相关文章:

unit-testing - 如何使用 Qunit 对在可观察对象上使用节流的 Knockout View 模型进行单元测试

c# - 无法使用绑定(bind)源刷新数据 GridView

asp.net - Smtp 发送带有样式表的邮件

jquery - MVC、WCF ASP.NET 4.0 和 JQUERY

python - 在单元测试中隐藏 stderr 输出

java - Akka:测试主管推荐

c# - 有界阻塞集合会在广告期间丢失数据吗

c# - ASP.NET Core 声明是否可靠且安全,不会被篡改?

c# - 在多个分隔符上分隔字符串时,如何知道使用了哪个分隔符? (C#)

c# - 在物理路径中使用 HttpPostedFileBase.SaveAs 保存上传的文件