Тестирование 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
,