【问题标题】:Expected exception attribute limitation in Visual Studio Unit TestVisual Studio 单元测试中的预期异常属性限制
【发布时间】:2015-03-24 12:37:07
【问题描述】:

我必须为将一个枚举映射到另一个枚举的现有方法编写一个单元测试。本单元测试关注的是方法中没有定义映射的场景,我们在switch语句的default块中得到了异常。

enum players{sachin, ponting, mculum, gayle}
enum teams{westindies, australia, india, newzealand, southafrica}

public teams MappingMethod(players p)
{
  switch(p)
  {
    case sachin: return india;
    case gayle: return westindies;
    ......
    default: throw new ArgumentOutOfRangeException();
  }
}

我尝试了带有 ExpectedException 属性的单元测试,当我们遇到上述情况时,单元测试工作正常。但是当枚举中的所有项目都存在映射时,它会失败。

为了解决这个问题,我在单元测试中使用了 try..catch 块,并使用 Assert.IsInstanceOfType 来检查异常,而不是使用 ExpectedException 属性。

还有其他更好的方法来做这个单元测试吗?

【问题讨论】:

  • 也许重新考虑您在单元测试中实际尝试测试的内容?如果您使用“ExpectedException”,它的字面意思是您希望测试抛出异常。如果它有时抛出有时不抛出,那么它不是“预期的”。例如,在你的单元测试中,使用你知道会抛出的东西调用 MappingMethod。
  • 它是一个单元测试,当开发人员将项目添加到枚举并忘记或错过更新 MappingMethod 时,它应该会失败。由于这并不总是可能的,除了 try..catch 之外,您还建议使用什么方法

标签: c# vs-unit-testing-framework expected-exception


【解决方案1】:

看来您想要实现的是一种确保第一个枚举中的每个项目都应该与另一个枚举中的项目相对应的方法。也就是说,您希望MappingMethod 始终成功。如果是这种情况,那么我可能会建议您可能根本不需要ExpectedException。编写一个迭代Players 中所有元素并为每个元素调用 MappingMethod 的测试怎么样?如果有任何未映射的玩家,此测试将失败。

除此之外,您还可以编写一个测试,检查当您获得无效数据时是否引发了预期的异常。像这样的:

[TestMethod]
[ExpectedException(typeof(ArgumentOutOfRangeException))]
public void Throw_Exception_When_Mapping_Does_Not_Exist() {
    MappingMethod((Players)-1);
}

拿这个确切的代码加一点盐 - 如果我没记错的话,((Players)-1) 会给你一个 Players 类型的对象,它不对应于实际枚举中的任何元素(除非,当然,您已经分配了这样的值)。因此,对MappingMethod 的调用肯定会失败。

顺便说一句,我想补充一点,我不确定在 yoru 情况下使用枚举是否合适。通常,当枚举强制您使用某些 switch 语句时,这是一种代码异味,您应该考虑将枚举改为类。枚举通常用于表示简单的静态和有限的数据。我怀疑Players 应该是一个类而不是一个枚举。考虑如下结构:

class Player {
    public Teams Team { get; private set; }
    public string Name { get; private set; }

    public Player(string Name, Teams team) { /* set properties */ }
}

然后你会有一个玩家sachin = new Player("Sachin", Teams.India)。这确保了每个玩家都与一个团队相关联。此外,它更加动态,因为您可以稍后添加更多玩家,并且您可以为每个玩家添加更多统计数据等。

我希望这会有所帮助。祝你有美好的一天:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多