我有一个扩展方法,可根据日期时间类型计算到期日期。该方法如下所示:
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
,我是否还需要担心单元测试异常?
更新
我希望我能投票给多个答案。我决定使用Lee和dasblinkenlight建议的超出范围值。这是我的鳍单元测试:
[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));
}
答案 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);
}
枚举是值类型,因此它们不能为空。