NUnit是否需要“魔术字符串”,而MSTest不需要?

时间:2011-06-16 20:17:21

标签: c# visual-studio unit-testing nunit mstest

我正在尝试决定单元测试框架。我刚刚阅读this comparison between NUnit and MSTest,在“我们的第三次测试 - NUnit”下的示例中,魔术字符串用于表示属性名称,而MSTest版本则不是。

这是MSTest版本:

Assert.IsNotNull(b.Players.Where(x => x.Name.Equals("Cross")));
Assert.IsNotNull(b.Players.Where(x => x.Name.Equals("Nought")));

这是NUnit版本:

Assert.That(b.Players, Has.Some.With.Property("Name").EqualTo("Nought"));
Assert.That(b.Players, Has.Some.With.Property("Name").EqualTo("Cross"));

作者(bearbonescoder)声称NUnit版本更好,因为它的流畅风格更具可读性,而一些评论者不同意,因为NUnit需要属性名称的“魔术字符串”。作者似乎没有解决这个批评,但对我来说,这对于NUnit而言在重构方面似乎是一个相当严重的劣势。

(顺便说一句,我喜欢LINQ,所以我发现MSTest语句甚至远远都难以理解。而且除了旁白,我相信作者在他的例子中使用的LINQ查询是不正确的 - a导致没有记录的Where表达式将返回空IEnumerable<T>而不是null。)

无论如何,我的问题:

  1. NUnit是否需要如上例所示的“魔术字符串”,或者是否有不同且合理有效的方法来编写没有魔术字符串的相同断言? (注意:我只是指“姓名”,而不是“Naught”和“Cross”。)

  2. 我应该关心吗?

1 个答案:

答案 0 :(得分:6)

如果您所做的断言有效或无效,那么最终唯一重要的事情。在NUnit和MSTest中,有几种方法可以检查事物。您不必使用流畅的语法,您可以编写相同的断言,例如:

Assert.True(b.Players.Any(p => p.Name == "Cross");

就个人而言,我更喜欢简单(r)检查的流利语法,例如

Assert.That(b.Name, Is.EqualTo("Stan"));

Assert.That(b.Players, Is.Not.Null);

最后,您应该使用您认为更具可读性的任何内容,而不必担心特定测试框架的实现细节。我知道这确实没有回答你的问题,但我认为这不应该是一个问题,因为它可以以多种方式做事。

(作为旁注,我更喜欢NUnit,因为语法流利,还有Assert.Throws及其相对的Assert.DoesNotThrow之类的东西,以及方便的断言类,如CollectionAssertStringAssert,MSTest中没有任何一个。