NUnit在测试中保持静态数据

Jam*_*mie 6 c# nunit unit-testing

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

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

OrderDto orderDto = SampleData.OrderDto;
OrderDetailDto orderDetailDto = SampleData.OrderDetailDto;
orderDto.OrderDetails.Add(orderDetailDto);
Run Code Online (Sandbox Code Playgroud)

样本数据是这样的:

public static class SampleData {
    public static OrderDto OrderDto = new OrderDto { LastName = "Smith", CreatedById = 5, CreatedByDisplayName = "Smith2" };
}
Run Code Online (Sandbox Code Playgroud)

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

Igo*_*aka 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);
  }
}
Run Code Online (Sandbox Code Playgroud)


Tru*_*ill 7

测试应该是孤立的,但这并不意味着它们是自动的.

NUnit将[SetUp]在每次测试之前和[TearDown]之后运行TestFixture的方法.您可以使用此属性和其他NUnit属性来设置夹具.