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.)
无论如何,我的问题:
NUnit是否真的需要像上面例子那样的"魔术字符串",或者是否有一种不同且合理有效的方法来编写没有魔术字符串的相同断言?(注意:我只指"名字",而不是"Naught"和"Cross".)
我应该关心吗?
如果您做出的断言有效或无效,那么最后唯一重要的事情就是.在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,以及方便的断言类,例如CollectionAssert和StringAssert,MSTest中都没有.
| 归档时间: |
|
| 查看次数: |
754 次 |
| 最近记录: |