最近,当为类编写单元测试时(特别是在使用DI和mocks时),我发现将测试构造为一个实际运行测试的类和一个负责设置的类非常方便,这有助于我保持测试的整洁和可读性。
测试类如下所示
public class MyFooBarTests
{
MyFooBarTestFixture _testFixture = new MyFooBarTestFixture();
[SetUp]
public void SetUp()
{
_testFixture.SetUp();
}
[Test]
public void ATest()
{
_testFixture.GivenRepositoryReturnsPi();
_testFixture.CallMyFancyMethod();
_testFixture.AssertQuxBaxIs(3.14159);
}
}我称之为测试夹具的样子是这样的
internal class MyFooBarTestFixture
{
private Mock<IRepository> _repositoryMock;
private MyFooBar _cut;
public void SetUp()
{
SetUpRepositoryMock(); // elided
SetUpCut();
}
private void SetUpCut()
{
_cut = new MyFooBar(_repositoryMock.Object);
}
public void GivenRepositoryReturnsPi()
{
_repositoryMock.Setup(r => r.GetValue()).Returns(Math.PI);
}
public void CallMyFancyMethod()
{
_cut.MyFancyMethod();
}
public void AssertQuxBaxIsEqual(double expectedValue)
{
Assert.That(_cut.QuxBaz, Is.EqualTo(expectedValue)); // elided correct floating point comparison
}
}在我看来,这种分离是很有帮助的。当查看测试类时,测试正在做什么是非常清楚的,而如何完成测试的细节则隐藏在测试夹具中,并被整齐地封装在测试夹具中。测试夹具又有简洁、简洁的方法。
像这样组织我的单元测试有什么缺点?
一些想法:
发布于 2017-12-11 08:30:03
这是一个很好的范例,而且“是的”--你的名字是误导人的。它实际上是一个试验帮手。它不仅在设置中很有用,而且在验证方面也是有益的(一般来说,Assert.cs中的NUnit符合这种模式)。
好处不限于使您的测试代码更具可读性(对测试作为文件有好处)。它还使您能够针对这些帮助方法编写测试。因此,实现了缺陷定位。
根据缺点,我找不到具体的缺点。我唯一能看到的是,在获得了这样的帮助之后,您可能希望在不同的测试用例中使用它们。这就是事情变得一团糟的地方。如果你不仔细组织它们,这些帮手很容易变胖。然后
更多xunit模式,签出xUnit测试模式:重构测试代码
发布于 2017-12-11 09:09:54
https://softwareengineering.stackexchange.com/questions/362158
复制相似问题