繁体   English   中英

如何使用数据注释处理 C# 中的枚举并使用 XUnit 对其进行测试

[英]How to handle Enums in C# with Data Annotations and testing it with XUnit

我想限制我的 DTO 的价值。

我有一个月份的枚举:

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

现在在我的 DTO 中,我有:

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

我需要使用数据注释才能只接受 From MarchOctober ,并对其进行测试。 使用Xunit作为https://docs.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);
}

并检查错误

[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 一起使用?

这看起来有点“hacky”恕我直言。 DataAnnotations 是应用于类属性的规则,以防止输入无效值。 这确认该值将始终有效。 通常它应用于“太大”和“可以输入的值不同”的值。 作为一个例子[StringLength(50, MinimumLength = 3)] ,你限制了string的长度。

在 enum 的情况下:您不想使用其他值,然后从MarchOctober ,那么为什么要将它们保留在 enum 本身中呢? 从问题看来,您只想拥有这些值,因此它是有道理的:

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

无论如何,如果这对您来说还不够,您可以使用params 作为 array定义您的自定义数据注释

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; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM