2011-05-29 44 views
6

我有一个静态类,我用来保存我的测试数据。当我在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订单明细。第二次有1,然后2等。我认为在NUnit测试之间,什么都没有持续。它缓存静态属性吗?

回答

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); 
    } 
} 
0

我想我回答了我自己的问题多一点摆弄。不过不知道为什么它被更新的对象,但如果我改变静态类此,它的工作原理:

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

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

6

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

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