C# 测试覆盖的ValidationAttribute是否有效
我在测试自定义验证属性时遇到了一些麻烦。当我在单元测试中调用C# 测试覆盖的ValidationAttribute是否有效,c#,asp.net-mvc,unit-testing,moq,validationattribute,C#,Asp.net Mvc,Unit Testing,Moq,Validationattribute,我在测试自定义验证属性时遇到了一些麻烦。当我在单元测试中调用IsValid方法时,由于方法签名是protected,我无法通过Mock对象,而是调用基本虚拟bool IsValid(对象值) 验证属性 protected override ValidationResult IsValid(object value, ValidationContext validationContext) { var otherPropertyInfo = validationContext.Object
IsValid
方法时,由于方法签名是protected
,我无法通过Mock
对象,而是调用基本虚拟bool IsValid(对象值)
验证属性
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);
}
如果无法通过模拟验证上下文,那么如何正确测试该类?您可以使用该类手动执行验证,而无需模拟任何内容。有一篇关于它的简短文章。我可能会这样做
[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; }
}
[测试]
当属性为Null且其他属性为Null()时,public void应为有效
{
var target=新的ValidationTarget();
var context=新的ValidationContext(目标);
var results=新列表();
var isValid=Validator.TryValidateObject(目标、上下文、结果、true);
Assert.That(isValid,Is.True);
}
私有类验证目标
{
公共字符串X{get;set;}
[选项F(名称(X))]
公共字符串OptionalFX{get;set;}
}
您可以选择对
结果进行断言
这实际上是我最后做的事情,但忘了在这里给出答案。您应该在Validator.TryValidateObject中设置validateAllProperties arg,否则它不会检查属性,var isValidate=Validator.TryValidateObject(目标、上下文、结果、true);谢谢@FeiyuZhou,如果没有validateAllProperties=true,它不会验证我的自定义属性,每次都返回IsValid=true。