2017-03-10 73 views
1

大家。我現在正在進行單元測試,而我有一個問題,我無法自己解決。 問題列表如下:C#:我如何實例化私有內部類的列表?

public class A { 
    private class B{ } 
    private List<B> list = new List<B>; 
} 

我想測試list[i]是否null與否?現在我可以使用Reflection來獲取列表,但問題是如何將B的實例添加到列表中? 感謝您的幫助!

+0

這不是你的工作,以測試C#編譯器。這個列表永遠不會在運行時可訪問的範圍內爲空。請顯示您的實際問題的代表性示例。 – CodeCaster

回答

2

一般來說,只是測試這段代碼是沒有生產力的。 雖然我不同意你得到的另一個答案:不測試私人,測試應該是有意義的行爲。

當然,您可以爲每個成員編寫單元測試,使得重構任何類型的主要PIB。這會產生效果嗎?不是真的。

但是,對於它的價值,你只需要多一點反思魔術瞧:

[TestMethod] 
    public void PrivateListCanHaveObjectsAdded() 
    { 
     var target = new A(); 

     var b = typeof(A).GetNestedType("B", BindingFlags.NonPublic); 
     var list = typeof(A).GetField("list", BindingFlags.Instance | BindingFlags.NonPublic); 

     var bInstance = Activator.CreateInstance(b); 
     var addMethod = typeof(List<>).MakeGenericType(b).GetMethod("Add"); 
     var countProperty = typeof(List<>).MakeGenericType(b).GetProperty("Count"); 
     addMethod.Invoke(list.GetValue(target), new object[] { bInstance }); 

     Assert.AreEqual(1, countProperty.GetValue(list.GetValue(target))); 
    } 
+0

它的工作原理!感謝您的分享! – Ico826

+0

如果答案適合您,請考慮接受。 – zaitsman

3

單元測試旨在測試......單元。它們並不意味着要測試程序的內部工作方式。它們旨在測試面向你的類的API的public

如果您的課程的公共方法有效,那麼您知道任何private機制也可以工作。如果private機制中斷,它們將導致公共方法停止工作。

+0

你可以稱它們爲「測試任何」,或者你可以稱它們爲「單元測試」。 ''測試'存在'是爲了確保沒有人修改代碼文件,以便在不知道它的情況下打破預期的行爲(無論是公共還是私人)。 – zaitsman

+1

謝謝你的回答!但是如果一個公共方法崩潰了,這個崩潰的原因不僅可能是私有的內部機制,它可能是在這個私人事件之後執行的,這意味着我必須確保我的測試中的私人事情是正確的,之後,我可以測試另一件事....? – Ico826