Visual Studio单元测试中的预期异常属性限制

时间:2015-03-24 12:37:08

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

我必须为现有方法编写单元测试,该方法将枚举映射到另一个枚举。此单元测试关注的是在方法中未定义映射的情况,并且我们在switch语句的默认块中获得异常。

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属性。

还有其他更好的方法来进行单元测试吗?

1 个答案:

答案 0 :(得分: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)。这可确保每个玩家与团队相关联。此外,它更具动态性,因为您可以在以后添加更多玩家,并且可以为每个玩家添加更多统计数据等。

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