如何对空枚举进行单元测试?

How to unit test an empty enum?

我有一个扩展方法可以根据日期期间类型计算截止日期。该方法如下所示:

public static DateTime CalculateDueDate(this DateTime date, OffsetType offsetType, int offset)
{
    switch (offsetType)
    {
        case OffsetType.Days:
            return date.AddDays(offset);
        case OffsetType.Weeks:
            return date.AddWeeks(offset);
        case OffsetType.Months:
            return date.AddMonths(offset);
        default:
            throw new ArgumentOutOfRangeException("offsetType", offsetType, null);
    }
}

其中 OffsetType 枚举具有这些可能的值:

public enum OffsetType
{
    Months = 1,
    Weeks = 2,
    Days = 3
}

如何确保在 OffsetType enum 未提供(或提供无效值)时抛出 ArgumentOutOfRangeException?如果 OffsetType 参数不是 null,我是否还需要担心对异常进行单元测试?

更新:

我希望我可以投票支持多个答案。我决定使用 and 建议的超出范围的值。这是我的鳍单元测试:

    [Test]
    public void CalculateDueDate_Throw_Exception_Test()
    {
        var date = DateTime.Now;
        var period = 3;
        var offsetType = (OffsetType) (-1);

        Assert.Throws<ArgumentOutOfRangeException>(() => date.CalculateDueDate(offsetType, period));
    }

您可以使用 Enum.IsDefined 检查一个值是否对特定枚举有效,例如:

if (!Enum.IsDefined(typeof(OffsetType),offsetType))
{
    throw new ArgumentOutOfRangeException("offsetType", offsetType, null);
}

枚举是值类型,因此它们不能为空。

您可以通过将超出范围的 int 显式转换为 OffsetType 来构造非法值,例如

OffsetType t = (OffsetType)5;

现在您可以调用 CalculateDueDate,将为单元测试构造的非法值传递给它,并断言抛出 ArgumentOutOfRangeException 类型的异常。

注意: 虽然在执行详尽 switch 涵盖所有 enum 情况的情况下它是多余的,但在涵盖 some 个带有 default 分支的有效案例,您应该使用 Enum.IsDefined(typeof(OffsetType), t).

检查无效值

您可以将超出范围的值转换为枚举类型:

Assert.Throws<ArgumentOutOfRangeException>(() => {
    CalculateDueDate(date, (OffsetType)(-1), offset);
});

您可以使用哪些值取决于枚举的基础类型。