我有一堆看起来像这样的代码:
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结果。
如果代码有效,我希望能够对行为进行单元测试,如果它值得测试则值得测试。我该怎么做呢?
答案 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次测试。