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

dev*_*xer 4 c# nunit unit-testing mstest visual-studio

我正在尝试决定一个单元测试框架.我刚刚阅读了NUnit和MSTest之间的这种比较,在"我们的第三次测试 - NUnit"下的示例中,魔术字符串用于表示属性名称,而MSTest版本则不是.

这是MSTest版本:

Assert.IsNotNull(b.Players.Where(x => x.Name.Equals("Cross")));
Assert.IsNotNull(b.Players.Where(x => x.Name.Equals("Nought")));
Run Code Online (Sandbox Code Playgroud)

这是NUnit版本:

Assert.That(b.Players, Has.Some.With.Property("Name").EqualTo("Nought"));
Assert.That(b.Players, Has.Some.With.Property("Name").EqualTo("Cross"));
Run Code Online (Sandbox Code Playgroud)

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

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

无论如何,我的问题:

  1. NUnit是否真的需要像上面例子那样的"魔术字符串",或者是否有一种不同且合理有效的方法来编写没有魔术字符串的相同断言?(注意:我只指"名字",而不是"Naught"和"Cross".)

  2. 我应该关心吗?

Iga*_*nik 6

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

Assert.True(b.Players.Any(p => p.Name == "Cross");
Run Code Online (Sandbox Code Playgroud)

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

Assert.That(b.Name, Is.EqualTo("Stan"));
Run Code Online (Sandbox Code Playgroud)

要么

Assert.That(b.Players, Is.Not.Null);
Run Code Online (Sandbox Code Playgroud)

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

(作为旁注,我更喜欢NUnit,因为它具有流畅的语法,但也喜欢Assert.Throws和它相反的东西Assert.DoesNotThrow,以及方便的断言类,例如CollectionAssertStringAssert,MSTest中都没有.

  • 据我所知,他更少关注实际语法,更多关于NUnit如何要求你的属性成为字符串,而不是使用实际的强类型对象.我对此也很好奇,NUnit可以使用强类型对象吗? (3认同)
  • @Mike M. NUnit不要求您使用字符串作为属性名称.它可以使用强类型对象.它总是有.`Has.Some.With.Property`语法是一种特殊情况.有几十种方法可以在NUnit中断言事物,而且几乎没有一种方法可以使用字符串作为属性名称. (2认同)
  • @Mike,我认为hmemcpy说的是NUnit*不*要求你的属性是一个字符串.我所指的博客文章的作者恰好以这种方式构建了他的断言语句,但没有理由需要特定的语法. (2认同)