2012-03-21 41 views
0

我有類似下面的代碼:附加功能打破了我的測試 - 很簡單的邏輯太

public List<string> Expected = new List<string>(); 
public int SpecifiedID; 

public DataIn(int ID, string Value) 
{ 
    Expected.Add(Value); 
    //if (ID == SpecifiedID) 
    //Expected.Clear(); 

    //Need to add this but my tests that do something like  
    //CollectionAssert.AreEqual(new[] { "2", "4", "6", "8" }, logic.Expected); 
    //all fail as Expected is empty. 
} 

//Example Test 
[Test] 
public void NewTestFunction() 
{ 
    MyClass logic = new MyClass(); 
    logic.SpecifiedID = 4; 

    logic.DataIn(1,"2"); 
    logic.DataIn(2,"4"); 
    logic.DataIn(3,"6"); 
    logic.DataIn(4,"8"); 

    //This will FAIL if Expected.Clear is added in the class. 
    CollectionAssert.AreEqual(new[] { "2", "4", "6", "8" }, logic.Expected); 
} 

這簡化了很多,但是我有檢查的Expected內容的有效性時DataIn被稱爲測試。但是我現在已經意識到我必須在每撥打DataIn之後清除Expected。這顯然打破了我的測試,因爲沒有任何內容可以反對。

關於如何保持驗證內容的測試的任何建議,但也允許我清空集合?

+0

哪個測試?這是不負責任的。 – 2012-03-21 12:42:37

+0

我有測試,如斷言CollectionAssert.AreEqual(新[] {「2」,「4」,「6」,「8」},邏輯.ExpectedValues);如果我在我的方法中添加Expected.Clear,則這些類型的測試失敗。 – Jon 2012-03-21 12:43:59

+0

大多數單元測試框架具有在所有單元測試之間運行的設置/拆卸機制。 – jgauffin 2012-03-21 12:45:06

回答

2

答案很簡單 - 您的代碼無法通過您的測試。即它不像預期的那樣行爲(你在你的測試中描述了預期的行爲)。因此,代碼應該改變 - 刪除對Expected.Clear()的調用。或者考慮一下你對代碼的期望。

UPDATE(針對情況下,當預期的變化):

public void ShoulHaveAllDataInWhenIdIsNotSpecifiedID() 
{ 
    MyClass logic = new MyClass(); 
    logic.SpecifiedID = 3; 

    logic.DataIn(1,"2"); 
    logic.DataIn(2,"4");  

    CollectionAssert.AreEqual(new[] { "2", "4" }, logic.Expected); 
} 

[Test] 
public void ShoulClearAllDataWhenSpecifiedIDPassed() 
{ 
    MyClass logic = new MyClass(); 
    logic.SpecifiedID = 3; 

    logic.DataIn(1,"2"); 
    logic.DataIn(2,"4"); 
    logic.DataIn(3,"6");  

    CollectionAssert.AreEqual(new[] { }, logic.Expected); 
} 

也可以考慮做行爲測試,而不是國家檢測。通過給你的課程提供模擬,你可以檢查它是如何與它們交互的。即檢查傳遞給你的類依賴的數據。

+0

我需要Expected.Clear在我的代碼!這是過於簡化,但我需要清除它 – Jon 2012-03-21 12:53:05

+2

@Jon:那麼你完全改變了你的方法的邏輯,你需要調整你的測試... – 2012-03-21 12:54:53

+0

@DanielHilgarth同意,這是我沒有問。我如何在問題中重寫示例測試? – Jon 2012-03-21 12:56:33

0

爲什麼不只是改變測試功能。創建一個新的測試功能:

[Test] 
public void NewTestFunction() 
{ 
    Data("Bla"); 

    //Test for something 


    Expected.Clear(); 
} 

如果這是你不問什麼,請澄清。

+0

我在問我如何運行我的測試來斷言預期即使Expected.Clear()需要添加到邏輯。由於Expected爲空,測試將失敗。 – Jon 2012-03-21 12:47:18

+0

@Jon:事實上在我的代碼中執行測試*收集之前清除 – Tigran 2012-03-21 12:48:54

+0

是的,但Expected.Clear需要進入被測試的類中的DataIn例程。我已經更新了我的問題 – Jon 2012-03-21 12:50:39

1

初始化爲已知良好狀態應該是您的測試/類設置方法的一部分。然而,從你的描述來看,你的測試似乎有太多的耦合,或者你的測試一次測試過多。每個測試,適當的設置,應該是獨立的,並且最好能夠並行運行。通常這意味着每個對象都在被測試的類的不同實例上運行,並且您不具有全局數據的依賴關係,或者至少這些依賴關係是隻讀的,因此您可以爲所有測試設置一次。

1

當SpecifiedID匹配一切都被清除

這是一個測試。實例化你的對象。給它一個X的SpecifiedId。用Y作爲第一個參數,然後用X作爲第一個參數,調用DataIn()。斷言Expected是空的。簡單。

下一次調用時它就啓動 驗證

這再次準備將數據添加到它是另一種考驗。實例化你的對象。給它一個X的SpecifiedId。重複調用DataIn(),永遠不要使用X作爲ID。聲明Expected包含傳遞的值。簡單。

兩個要求,兩個測試。真的,我看不出這裏有什麼大不了的。