如何对空枚举进行单元测试?
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);
});
您可以使用哪些值取决于枚举的基础类型。
我有一个扩展方法可以根据日期期间类型计算截止日期。该方法如下所示:
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
,我是否还需要担心对异常进行单元测试?
更新:
我希望我可以投票支持多个答案。我决定使用
[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);
});
您可以使用哪些值取决于枚举的基础类型。