2011-05-29 23 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來設置你的燈具。