Тестирование ValidationAttribute, который переопределяет IsValid

У меня возникли некоторые проблемы с тестированием моего пользовательского атрибута проверки. Как подпись метода protected когда я призываю IsValid метод в моем модульном тесте, я не могу пройти в Mock<ValidationContext> объект, это вызывает базу virtual bool IsValid(object value) вместо.

ValidationAttribute

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

Если я не могу передать проверенный контекст проверки, как я могу правильно протестировать этот класс?

1 ответ

Решение

Вы можете использовать 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);

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

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

    [OptionalIf(nameof(X))]
    public string OptionalIfX { get; set; }
}

При желании вы можете сделать results,

Другие вопросы по тегам