使用自定义FluentValidator验证程序验证枚举

时间:2012-10-30 22:59:38

标签: c# unit-testing testing lambda fluentvalidation

我创建了一个自定义验证器,用于测试值是否在枚举的有效值范围内:

public class IsInEnumValidator<T> : PropertyValidator {
  public IsInEnumValidator() : base("Property {PropertyName} it not a valid enum value.") { }
  protected override bool IsValid(PropertyValidatorContext context) {
    if (!typeof(T).IsEnum) return false;
    return Enum.IsDefined(typeof(T), context.PropertyValue);
  }
}

用于链接验证器的扩展方法:

public static IRuleBuilderOptions<T, TProperty> IsInEnum<T, TProperty>(this IRuleBuilder<T, TProperty> ruleBuilder) {
  return ruleBuilder.SetValidator(new IsInEnumValidator<TProperty>());
}

我想用它来像这样:

RuleFor(x => x.Day).IsInEnum<DayOfWeek>();

我的问题:

  1. 这不能按预期工作,因为我需要设置....IsInEnum<T, DayOfWeek>()而不是所需的....IsInEnum<DayOfWeek>();。我如何实现这一目标?

  2. 我想测试这个自定义验证器 - 不是用这个验证器测试我的数据,而是测试验证器本身。该库的文档解释了如何测试数据,而不是如何测试自定义验证器。库中似乎有很多测试代码,有什么我可以重用的吗?我使用NUnit。

2 个答案:

答案 0 :(得分:10)

1:由于类型推断,您实际上不需要在IsInEnum()调用中指定任何内容。

2:对于测试,该项目有许多测试可以适应这个scneario。

答案 1 :(得分:4)

自版本6.2以来IsInEnum是内置的。 从6.2.1支持Nullable Enums。

干杯。