NUnit在测试中保持静态数据

问题描述 投票:6回答:3

我有一个静态类,我用它来保存我的测试数据。当我在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测试之间,没有任何东西被持久化。它是否缓存静态属性?

c# unit-testing nunit
3个回答
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);
  }
}

7
投票

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

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


0
投票

我觉得我回答了自己的问题,有点摆弄。仍然不确定为什么它正在更新对象,但如果我将静态类更改为此,它的工作原理:

public static class SampleData {
    public static OrderDto OrderDto {
        get { return new OrderDto { LastName = "Smith", CreatedById = 5, CreatedByDisplayName = "Smith2" }; }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.