如何从单元测试中使用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; }
}
您可以定义一个自定义属性,如下所示:
[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; }