asd*_*eee 10 c# tdd nunit assert assertions
您认为对结果执行多个断言的最简洁方法是什么?在过去,我已经对它们进行了相同的测试但是这开始感觉有点脏,我刚刚使用设置玩另一个想法.
[TestFixture]
public class GridControllerTests
{
protected readonly string RequestedViewId = "A1";
protected GridViewModel Result { get; set;}
[TestFixtureSetUp]
public void Get_UsingStaticSettings_Assign()
{
var dataRepository = new XmlRepository("test.xml");
var settingsRepository = new StaticViewSettingsRepository();
var controller = new GridController(dataRepository, settingsRepository);
this.Result = controller.Get(RequestedViewId);
}
[Test]
public void Get_UsingStaticSettings_NotNull()
{
Assert.That(this.Result,Is.Not.Null);
}
[Test]
public void Get_UsingStaticSettings_HasData()
{
Assert.That(this.Result.Data,Is.Not.Null);
Assert.That(this.Result.Data.Count,Is.GreaterThan(0));
}
[Test]
public void Get_UsingStaticSettings_IdMatches()
{
Assert.That(this.Result.State.ViewId,Is.EqualTo(RequestedViewId));
}
[Test]
public void Get_UsingStaticSettings_FirstTimePageIsOne()
{
Assert.That(this.Result.State.CurrentPage, Is.EqualTo(1));
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ann 15
在同一测试中有多个断言可以导致断言轮盘,所以这是你应该始终小心的事情.
但是,当断言不相关时,断言轮盘主要是一个问题.如果它们在概念上密切相关,那么许多断言通常可以被视为单个逻辑断言.
在许多情况下,通过在自定义类型或方法中显式封装此类逻辑断言,您可以充分利用这两个方面.
您需要遵循的是“安排”、“执行”、“断言”(然后结束测试)的模式。在您的情况下,所有安排都在 中TestFixtureSetUp,就像正在测试的操作一样。我会稍微重新安排一下,当您进行更多测试时,它可能会变得难以操作。正如 Dockers 指出的那样,应避免繁重的测试设置,它们可能会成为问题 - 它们在课堂上的所有测试中都是“一刀切”,因此可能会变得比大多数测试所需的更重。
如果您想继续进行另一个后续操作,然后进行更多断言,请将其放入单独的测试中。
我对将多个断言放在同一个测试中没有任何问题,只要它们有助于测试相同的事物(即是同一“逻辑断言”的一部分)。在这种情况下,对 this.Result.Data 的内容进行任意数量的断言对我来说都是可以的 - 它们都会检查相同的结果值。你的Get_UsingStaticSettings_HasData这一点做得非常清楚。最好对每个断言使用唯一的失败消息,以便更容易判断哪个断言失败。
或者,您可以将相关断言包装在一个方法中。如果您多次使用它,这对于通常的 DRY 原因很有用,但除此之外我不认为这是一个很大的区别。
总结
* 每次测试执行一项操作
* 执行该操作后,根据需要使用尽可能多的相关断言来测试一件事
* 在那里结束测试。