首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试覆盖ValidationAttribute的IsValid

测试覆盖ValidationAttribute的IsValid
EN

Stack Overflow用户
提问于 2016-01-13 11:44:12
回答 1查看 9K关注 0票数 11

我在测试我的自定义验证属性时遇到了一些困难。由于方法签名是protected,所以当我在单元测试中调用IsValid方法时,不能传递Mock<ValidationContext>对象,而是调用基本virtual bool IsValid(object value)

ValidationAttribute

代码语言:javascript
复制
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;
}

测试

代码语言:javascript
复制
[Test]
public void Should_BeValid_WhenPropertyIsNullAndOtherPropertyIsNull()
{
    var attribute = new OptionalIfAttribute("test");
    var result = attribute.IsValid(null);

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

如果我无法通过模拟的验证上下文,那么如何正确地测试这个类?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-24 23:26:15

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

代码语言:javascript
复制
[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上进行断言。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34765859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档