单位测试方法是坏的吗?

时间:2012-04-11 15:33:08

标签: c# .net unit-testing

我正在测试一个类,它与其他类有很多依赖关系。要解决这个问题,我使用模拟器。到目前为止,这非常有效。

[Test]
public void DataField_Gets_Properly_Created()
{
    // Arrange all those mocks

    _dataField =  new DataField(dependency1, dependency2, dependency3);

    Assert.NotNull(dataField.Id);
    // other assertions ...
}

[Test]
public void DataField_Gets_Properly_Saved()
{
    var entityList = new List<IEntity>();
    var dfId = Guid.NewGuid();

    _dataField.SetValue(true, entityList, dfId);

    Assert.True(_datenFeld.ValueBoolean);
    // other assertions
}

如您所见,我使用此私有_dataField变量。你知道,我实际测试是否可以在第一次测试中创建数据字段。在第二个测试中使用相同的数据字段是不是一个糟糕的方法,它只是在第一个方法中创建的?我认为这不是很干净的代码。

我的第二个想法是在[Setup]中创建此数据字段。这也不是很干净,因为如果它甚至可以创建,我应该如何在设置和测试中创建它?我很困惑。

之后可能会有更多的测试需要一个数据字段实例来测试实际的类DataField

2 个答案:

答案 0 :(得分:4)

单元测试不应该依赖于任何其他单元测试。你应该能够单独运行每一个并让它们通过,你应该能够以任意顺序运行它们。

在这种情况下,我建议您使用在每次测试中重新初始化的局部变量,但是要安排[Setup]中的所有模拟。您可以将初始化封装在辅助方法CreateDataFieldForTest()或类似方法中。

答案 1 :(得分:3)

您的单元测试不应依赖于其他单元测试。

标有[Setup]的功能将在您班级的每个 [Test]功能之前调用。因此,如果您将_dataField创建移动到[Setup],它将不断重新创建它。这是你不确定的吗?

标有[TestFixtureSetUp]的功能将在[TestFixure]开始时调用一次。所以在每个[Test]

之前都不会被调用
[SetUp]
public void TestSetup()
{
   _dataField =  new DataField(dependency1, dependency2, dependency3);
}

[Test]
public void DataField_Gets_Properly_Created()
{
    Assert.NotNull(dataField.Id);
    // other assertions ...
}

[Test]
public void Most_Test_Using_dataField()
{
    ...
}

如果未正确“初始化”,第一次测试将失败。在这种情况下,您将知道存在问题并且无法保证其他测试可以正常工作。