如何从单元测试中使用c#的数据注释来验证枚举类型的数组

本文关键字:注释 数据 枚举 数组 类型 验证 单元测试 | 更新日期: 2023-09-27 18:05:55

在下面的ColorSettings模型中,我能够用EnumDataType验证属性MyColor,以确保只有在ColorsEnum中定义的值可以输入,如下所示。

对于ColorsEnum类型的单个字符串值可以正常工作。
[Test]
public void ColorSettingsModel_MyColorEnum_Invalid()
{
  var sut = GetColorSettingsModel();
  sut.MyColor = "wrong color value";
  var context = new ValidationContext(sut, null, null);
  var validationResults = new List<ValidationResult>();
  var isModelStateValid = Validator.TryValidateObject(sut, context, validationResults, true);
  Assert.AreEqual(1, validationResults.Count);
  Assert.IsTrue(validationResults.Any(x => x.ErrorMessage == "MyColorEnum"));
}

我如何使用包含类型为ColorsEnum的数组的类似方法验证字段SelectedColors ?是否有一种方法将EnumDataType属性应用于ColorsEnum类型的数组?

public enum ColorsEnum
{
  red,
  blue,
  green
}
public class ColorSettings
{
  [Required(ErrorMessage = "MyColorRequired")]
  [EnumDataType(typeof(ColorsEnum), ErrorMessage = "MyColorEnum")]
  public string MyColor { get; set; }
  [Required(ErrorMessage = "SelectedColorsRequired")]
  // How to validate an array of type ColorsEnum with EnumDataType ?
  public string[] SelectedColors { get; set; }
}

如何从单元测试中使用c#的数据注释来验证枚举类型的数组

您可以定义一个自定义属性,如下所示:

[AttributeUsage(AttributeTargets.Parameter | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false)]
public sealed class EnumDataTypeArrayAttribute : DataTypeAttribute
{
    public EnumDataTypeArrayAttribute(Type enumType)
        : base("Enumeration")
    {
        if (enumType == null)
        {
            throw new InvalidOperationException("Type cannot be null");
        }
        if (!enumType.IsEnum)
        {
            throw new InvalidOperationException("Type must be an enum");
        }
        this.EnumType = enumType;
    }
    public override bool IsValid(object value)
    {
        if (value == null) return true;
        var at = value.GetType();
        if (!at.IsArray) return false;
        var t = at.GetElementType();
        if (t != this.EnumType) return false;
        foreach (var v in value as Array)
        {
            if (!Enum.IsDefined(this.EnumType, v))
            {
                return false;
            }
        }
        return true;
    }
    public Type EnumType
    {
        get;
        private set;
    }
}

然后注释你的属性或者任何你想验证的东西,像这样:

[EnumDataTypeArray(typeof(SomeEnumType))]
public SomeEnumType[] Types { get; set; }