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

Red*_*Red 2 c# enums nunit unit-testing

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

其中OffsetType枚举具有以下可能的值:

public enum OffsetType
{
    Months = 1,
    Weeks = 2,
    Days = 3
}
Run Code Online (Sandbox Code Playgroud)

如何ArgumentOutOfRangeExceptionOffsetType 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));
    }
Run Code Online (Sandbox Code Playgroud)

das*_*ght 7

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

OffsetType t = (OffsetType)5;
Run Code Online (Sandbox Code Playgroud)

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

注意:虽然在您执行详尽的switch覆盖所有情况的情况下这是多余的,但在使用分支覆盖某些有效情况的enum情况下,您应该使用 检查无效值。defaultEnum.IsDefined(typeof(OffsetType), t)


Lee*_*Lee 6

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

Assert.Throws<ArgumentOutOfRangeException>(() => {
    CalculateDueDate(date, (OffsetType)(-1), offset);
});
Run Code Online (Sandbox Code Playgroud)

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