我在测试我的自定义验证属性时遇到了一些困难。由于方法签名是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);
}如果我无法通过模拟的验证上下文,那么如何正确地测试这个类?
发布于 2016-01-24 23:26:15
您可以使用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上进行断言。
https://stackoverflow.com/questions/34765859
复制相似问题