C# NUnit在测试中保持静态数据

C# NUnit在测试中保持静态数据,c#,unit-testing,nunit,C#,Unit Testing,Nunit,我有一个静态类,用来保存测试数据。当我在NUnit测试中引用它时,我所做的任何更改都会在测试中持久化 例如,我的测试中有以下代码: OrderDto orderDto = SampleData.OrderDto; OrderDetailDto orderDetailDto = SampleData.OrderDetailDto; orderDto.OrderDetails.Add(orderDetailDto); 样本数据如下所示: public static class SampleData

我有一个静态类,用来保存测试数据。当我在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测试之间,什么都没有坚持。它会缓存静态属性吗?

我想我回答我自己的问题时有点费解。仍然不确定它为什么要更新对象,但如果我将静态类更改为此,它会工作:

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

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


NUnit将在每次测试之前运行标记有
[SetUp]
的TestFixture方法,然后运行标记有
[TearDown]
的TestFixture方法。您可以使用这个和另一个来设置夹具。

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

[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);
  }
}
大多数单元测试框架提供了一种初始化和清理测试前后状态的方法。在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);
  }
}

它正在更新静态对象,因为有一个实例,这就是您的测试所做的。单元测试就像普通代码一样;如果他们更新了一个静态字段,那么该字段就会被更新。现在,每次调用此方法时都会返回一个新实例,这意味着更改只会影响当前实例。