NUnit在测试中保持静态数据

时间:2011-05-29 22:53:01

标签: c# unit-testing nunit

我有一个静态类,我用它来保存我的测试数据。当我在NUnit测试中引用它时,我所做的任何更改都会在测试中保持不变。

例如,我在测试中有这段代码:

OrderDto orderDto = SampleData.OrderDto;
OrderDetailDto orderDetailDto = SampleData.OrderDetailDto;
orderDto.OrderDetails.Add(orderDetailDto);

样本数据是这样的:

public static class SampleData {
    public static OrderDto OrderDto = new OrderDto { LastName = "Smith", CreatedById = 5, CreatedByDisplayName = "Smith2" };
}

我第一次运行它时,orderDto有0个OrderDetails。第二次它有1,然后是2,等等。我想在NUnit测试之间,没有任何东西被持久化。它是否缓存静态属性?

3 个答案:

答案 0 :(得分:9)

确保数据不会在单元测试中保持不变,这取决于。执行时,单元测试程序集的行为就像普通程序集一样,因此您初始化的任何静态都会在测试期间保持这种状态。

大多数单元测试框架提供了一种在测试之前和之后初始化和清理状态的方法。在NUnit中,这样做的方法是使用具有[SetUp]属性的方法。在每次测试之前执行此方法。

实现我想要实现的目标的最简单方法是初始化TestSetup中的成员字段,并在不同测试之间使用它。请注意,我们在这里不使用静态成员,这意味着我们不必在测试后将其清理。

[TestFixture]
public class MyTests {

  OrderDto OrderDto;
  OrderDetailDto;
  [SetUp]
  public void Setup() {
    _OrderDto = new OrderDto { LastName = "Smith", CreatedById = 5, CreatedByDisplayName = "Smith2" };
    _OrderDetailDto = new OrderDetailDto {/*Sample data*/};
  }

  [Test]
  public void TestOrderDetailIsAddedToOrder() {
    orderDto.OrderDetails.Add(_OrderDetailDto);
  }
}

答案 1 :(得分:7)

测试应该被隔离,但这并不意味着它们是自动的。

NUnit将在每次测试之前运行一个标有[SetUp]的TestFixture方法,之后运行[TearDown]。你可以使用它和其他NUnit attributes来设置你的灯具。

答案 2 :(得分:0)

我想我回答了自己的问题。仍然不确定为什么它正在更新对象,但如果我将静态类更改为此,它可以工作:

public static class SampleData {
    public static OrderDto OrderDto {
        get { return new OrderDto { LastName = "Smith", CreatedById = 5, CreatedByDisplayName = "Smith2" }; }
    }
}