如何在c#中使用数据注释处理枚举并使用XUnit进行测试



我想限制我的DTO的值。

我有一个月的enum:

public enum Month
{
January,
February,
March,
May,
June,
July,
August,
September,
October,
November,
December
}

现在在我的DTO中我有:

public class MyDTO {
public Month Month{ get; set; }
}

我需要使用数据注释,以便只接受从MarchOctober,并对其进行测试。以Xunit为https://learn.microsoft.com/en-us/dotnet/core/testing/unit-testing-with-dotnet-test

[Fact]
public void valid DTO_Months_ok()
{
var dto = MyDTO()
{
Month = Month.March
}
var result = dto.validate();
Assert.Equal(0, result.Count);
}

并检查Error

[Fact]
public void valid DTO_Months_Error()
{
var dto = MyDTO()
{
Month = Month.February
}
var result = dto.validate();
Assert.Equal(1, result.Count);
}

我的问题是DataAnnotation。

如何使用DataAnnotation与Enum?

这看起来有点"俗气";恕我直言。数据注释是应该应用于类的属性的规则,以防止输入无效的值。这确认了该值将始终有效。它通常用于"太大"的值。以及可输入的值各不相同。以[StringLength(50, MinimumLength = 3)]为例,您限制了string的长度。

在enum的情况下:您不想使用MarchOctober之间的其他值,那么为什么要将它们保留在enum本身中呢?从问题上看,您似乎只想要这些值,因此它将有意义:

public enum RestrictedMonth
{
March,
May,
June,
July,
August,
September,
October,
}

无论如何,如果这对你来说还不够,你可以定义你的自定义数据注释与参数数组:

public class EnumInRangeAttribute : ValidationAttribute
{
public Month[] ValidMonths { get; set; }
public EnumInRangeAttribute()
{
ValidMonths = new Month[0];
}
public EnumInRangeAttribute(params Month[] ValidMonths)
{
this.ValidMonths = ValidMonths;
}
public override bool IsValid(object value)
{
if (value is Month monthValue)
{
return ValidMonths.Contains(monthValue);
}
return true;
}
}
public class MyDTO {
[EnumInRange(Month.March,
Month.May,
Month.June,
Month.July,
Month.August,
Month.September,
Month.October)]
public Month Month { get; set; }
}

相关内容

  • 没有找到相关文章

最新更新