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

时间:2016-06-22 15:22:23

标签: c# unit-testing enums nunit

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

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
}

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

更新

我希望我能投票给多个答案。我决定使用Leedasblinkenlight建议的超出范围值。这是我的鳍单元测试:

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

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:2)

您可以通过明确地将超出范围http://demo.localhost/投射到http://demo.localhost/_/default/Home/HomePage来构建非法值,例如

int

现在你可以调用OffsetType,传递为单元测试构造的非法值,并断言抛出类型OffsetType t = (OffsetType)5; 的异常。

注意:虽然在执行涵盖所有CalculateDueDate案例的详尽ArgumentOutOfRangeException的情况下,如果您覆盖部分,情况会多余有switch分支的有效案例,您应使用Enum.IsDefined(typeof(OffsetType), t)检查无效值。

答案 2 :(得分:0)

您可以检查值是否对具有Enum.IsDefined的特定枚举有效,例如:

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

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