1

我有一段代码看起来有点像这样:

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 结果。

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

4

3 回答 3

0

您宁愿使用Replace Conditional with Polymorphism来重构它。

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

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

于 2009-06-05T14:22:04.813 回答
0

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

于 2009-06-05T14:25:17.287 回答
0

如果您的业务需求表明没有其他 DiaryMode 是可接受的,那么 else 语句是一个非常好的用途,可以防止将来对您的 DiaryMode 枚举进行扩展。

至于测试,这有点棘手。我肯定会测试所有有效的状态(Admin、Academy 和 Scouting)。但是,您不能真正将模式设置为不存在的枚举值,这将是引发 NotsupportedException 的唯一方法。我可能会考虑尝试编写一个测试来验证枚举是否只携带您期望的枚举。

您可以通过执行以下操作来做到这一点:

Enum.GetNames(typeof(DiaryMode))

然后验证每个名称。

总而言之,根据我的描述,您将有 4 个测试。

  • 管理员测试
  • 学院考试
  • 侦察测试
  • 检查 DiaryMode 枚举中所有名称的测试
于 2009-06-05T14:26:39.343 回答