簡體   English   中英

在C#中測試/注入私有字段的好習慣是什么?

[英]What are the good practice to test/inject private field in C#

如果這個重復,我道歉。 我被賦予了為該方法添加一些覆蓋的任務,並被告知模擬私有List<string>屬性。 我的問題是: 有沒有辦法測試私有字段?

我找到的解決方案是添加新的構造函數只是為了注入這個私有列表。 我不確定這是否正確,所以任何幫助都將受到高度贊賞。

public class Class1
{
    public Class1(List<string> list)//This is just for Unit Testing 
    {
        list1 = list;
    }


    private readonly InjectRepository _repository;
    //
    public Class1(InjectRepository repository)//This is the actual constructor
    {
        _repository = repository;
    }

    private List<string> list1 = new List<string>();

    public void Do_Complex_Logic()
    {
       //list1 will be set with items in it
       //Now list1 is passed to some other instance
    }
}

類的私有邏輯應該在其行為的公共表達中可見。 換句話說,理論上說,根本不需要測試私有字段。

無法直接測試私有字段; 畢竟他們是私人的。 如果您真的認為需要測試私有字段,那么我建議將其設置為內部,並通過[InternalsVisibleTo]屬性將其公開給您的單元測試程序集。

話雖這么說,有些框架允許這樣的事情,比如TypeMock

不要測試私有字段或方法。 測試合同的行為 - 公共或內部方法。

那說,你可以嘗試:

選項A.
使私有成員內部並為要測試的程序集設置InternalsVisibleTo屬性。

選項B.
編寫一個包裝類,將私有字段/方法包裝到公共字段/方法中。 這種方法的好處是您不需要將私有方法設置為內部方法。 缺點是,對於每個私有方法,您將擁有一個包裝器公共方法。 所以方法的數量可能會翻倍。

添加到womp&oleksii已經說過 -

您希望/需要測試私有方法的事實是一個標志(氣味?),您的設計可能不正確。 這是TDD(以及我個人最喜歡的)的積極副作用之一。

一個例子:

我在這里並不完全了解你的域名,但是一個簡單的改變可能是,而不是沒有參數的Do_Complex_Logic ,你可以讓它接受並返回一個List<string>

public List<string> Do_Complex_Logic( List<string> input )

我知道 - 這很簡單 ,但是請嘗試解構一下你的課程,然后首先考慮測試。

我不同意其他答案; 但在這種情況下,我認為最合適的事情是 - 給出你的代碼; 是改變簽名

'Do_Complex_Logic'

真正的問題是你正在處理List1的'狀態'。 如果將List1傳遞給Do_Complex_Logic - 您的問題基本上已得到解決。 您的評論說'Do_Complex_Logic'將(可能)在List1上做一些工作,然后將其傳遞給其他東西,對吧?

使Do_Complex_Logic獲取List並返回List。 現在很容易測試。 您可以“注入依賴項”,而不是依賴於在類中正確設置List1的狀態。

私人領域如何在第一時間做好准備? 如果是通過與存儲庫的交互,那么您可能會模擬該對象。

一種方法是通過接口與您的存儲庫進行交互(讓我們稱之為IInjectRepository而不是具體的實體,然后使用類似Moq (或其中許多模擬框架中的一個)來通過模擬填充您的數據在設置測試時存儲庫。在調用Do_Complex_Logic我假設您有一種詢問實體的方法,以便您知道它已經完成了您的預期。這樣您就可以避免/減輕添加的方法和類僅測試。

您可以在回答相關問題的https://stackoverflow.com/a/3376157/1523402中使用反射
我不知道私人訪問者是否也適用於私人領域。 但它們(至少)幫助私有方法(請參閱http://msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM