无效枚举值的单元测试

时间:2009-06-05 14:15:42

标签: vb.net unit-testing mstest

我有一堆看起来像这样的代码:

If mode = DiaryMode.Admin Then
    modeObject = DBNull.Value
ElseIf mode = DiaryMode.Academy Then
    modeObject = ApplicationSettings.Academy
ElseIf mode = DiaryMode.Scouting Then
    modeObject = ApplicationSettings.Scouting
Else
    Throw New NotSupportedException()
End If

检查的想法是为传递到数据库调用准备一些值。

有两个问题,Else值得努力吗?目的是防止将来扩展枚举,导致代码返回squify结果。

如果代码有效,我希望能够对行为进行单元测试,如果它值得测试则值得测试。我该怎么做呢?

3 个答案:

答案 0 :(得分:0)

您宁愿使用Replace Conditional with Polymorphism重构此内容。

为这些行编写测试用例将证明“if ... then ... else”语句返回正确的modeObject,但我不会花太多时间在它上面。但是,它可能并非完全没有意义:如果您计划添加新模式,测试将确保它们将按预期处理,特别是如果要进行一些切割和切换。涉及粘贴(粘贴代码并且无法相应地修改代码并不罕见。)

这就是我要做的事情:我会编写测试用例,然后重构一个处理模式的类层次结构,然后重新运行测试以确保我没有破坏任何东西。听起来像一个计划?

答案 1 :(得分:0)

添加Else似乎足够合理。如果使用内置的Visual Studio单元测试,实际上有一个属性表明您希望测试为成功抛出异常:ExpectedExceptionAttribute

答案 2 :(得分:0)

如果您的业务要求声明没有其他DiaryMode可以接受,那么else语句可以很好地用于防止您的DiaryMode枚举的未来扩展。

至于测试,这有点棘手。我肯定会测试所有有效状态(管理员,学院和侦察员)。但是,您无法将模式设置为不存在的枚举值,这将是抛出NotsupportedException的唯一方法。我可能会尝试编写一个测试来验证枚举是否只包含您期望的枚举。

你可以通过做这样的事情来做到这一点:

Enum.GetNames(typeof(DiaryMode))

然后验证每个名字。

总而言之,你将根据我的描述进行4次测试。

  • 管理员测试
  • 学院考试
  • 侦察测试
  • 测试检查DiaryMode枚举中的所有名称