0

我必须为将一个枚举映射到另一个枚举的现有方法编写一个单元测试。本单元测试关注的是方法中没有定义映射的场景,我们在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 属性。

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

4

1 回答 1

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)。这确保了每个玩家都与一个团队相关联。此外,它更加动态,因为您可以稍后添加更多玩家,并且您可以为每个玩家添加更多统计信息等。

我希望这有帮助。祝你今天过得愉快 :)

于 2015-03-25T15:00:46.727 回答