2017-03-03 92 views
0

我有一個難於測試包含對象列表的類的單元。如何在單元測試中設置私有變量

這裏是我有什麼

public class A 
{ 
    List<B> _list; 

    public A() 
    { 
     _list = new List<B>(); 
    } 
    public void AddNewB(DateTime time) 
    { 
     _list.Add(new B(time)); 
    } 
    public List<B> GetAllBs() 
    { 
     return _list; 
    } 
} 

我想有一個測試,證明添加新B不清除我的列表。但是由於這個列表是私人的,我無法設置一個現有列表,通過我想測試的代碼。由於A類負責創建所有新B並將其添加到列表中,並且所有新A都應該有一個B的空列表,所以爲了測試而在構造函數中添加一個參數感覺很奇怪。

編輯:我修復了GetAllBs,因爲它是AddNewBs的複製粘貼錯誤。

+3

請記住,你正在測試的單元是類,而不是方法。只要該類的公共接口表現自己,你就不應該在乎它在內部做什麼。就你的測試而言,'_list'可能不存在。 –

+0

您可能想閱讀這個http://stackoverflow.com/a/1093481/2096538。你不應該關心類的內部實現,你應該檢查外部可見的效果是否符合你的期望,否則你的測試被綁定到類的內部實現上。 –

+0

我感覺很奇怪,要調用我想測試的方法來設置我的測試。 –

回答

4

首先,這種方法不會編譯:

public void GetAllBs(DateTime time) 
{ 
    return _list; 
} 

它的返回類型void(沒有返回值),但你返回List<B>。另外,你不需要參數來返回結果。將其更改爲:

public List<B> GetAllBs() 

關於測試:,你可以很方便地測試列表。您的測試方法是這樣的:

[TestMethod] 
public void Test() 
{ 
    A a = new A(); 
    a.AddNewB(DateTime.Now);  
    a.AddNewB(DateTime.Now); 

    Assert.AreEqual(2, a.GetAllBs().Count); 
} 

您應該創建A類的對象,並調用AddNewB()添加一些元素。爲了確保在添加新元素後列表不會被清除,您應該再添加一個元素,並檢查列表中的元素Count。要做到這一點,你應該打電話GetAllBs() - 它會返回列表 - 並得到CountCount應該等於2

如果您想確保該方法已經過測試,您可以使用一些顯示代碼覆蓋範圍的工具(DotCover,OpenCover)。

+0

GetAllBs是AddNewB的複製粘貼錯誤。 –

1

您還可以使用單元測試工具,允許您僞造私人領域,例如我使用具有此功能的Typemock。 這樣你就可以在測試中創建一個本地列表,並將其注入到私人領域,以測試你的方法:

[TestMethod] 
public void TestMethod1() 
{ 
    List<B> fakeList = new List<B> { new B(DateTime.Now), new B(new DateTime(1956, 01, 21)) }; 
    var classA = Isolate.Fake.Instance<A>(Members.CallOriginal,ConstructorWillBe.Ignored); 

    var fakePrivate = Isolate.NonPublic.InstanceField(classA, "_list"); 
    fakePrivate.Value = fakeList; 

    classA.AddNewB(DateTime.MaxValue); 

    var res = classA.GetAllBs(); 

    Assert.AreEqual(3, res.Count); 
} 
相關問題