簡體   English   中英

在.NET中對私有方法進行單元測試的最佳實踐是什么?

[英]What is the best practice for unit testing private methods in .NET?

最近為了實現類的私有方法的單元測試,我通過創建私有訪問器而不是使用Reflection使用PrivateObject ,我收到了以下代碼審查注釋:

“我對私有對象的主要關注是在構造函數中使用object []。它取代了編譯器強制執行的強類型操作和JavaScript式運行時錯誤檢測。因此,個人而言,我不推薦它。”

根據我的理解,上面的這條評論使我感到困惑,Reflection也需要object[]來調用任何方法。 請幫助我了解最佳方法。

  • 您可以使用通過私有(現在受保護)方法繼承類的特殊類,並提供從外部受保護方法調用不可見的公共方法。

這在偉大的書重構測試代碼http://xunitpatterns.com/中稱為測試特定子類或測試特定擴展

您可以在此處閱讀有關測試私有方法的更多詳細信息和想法: http//xunitpatterns.com/Test-Specific%20Subclass.html

它很像

public TestClass : RealClass
{
    public int  CallHiddenCalculate()
    {
        return  Calculate(); // Calculate is now protected method that we expose for test purposes in this class
    }
}

您可以將此類放置為測試程序集,以便您的實際程序集不包含特定於測試的邏輯和類,因為它的設計很糟糕。

  • 您還可以使用條件編譯作為可見性屬性,如下所示
#if DEBUG
        public
    #else
        private
    #endif

在這種情況下,在Debug中,您可以調用單元測試,但在發布時,這些方法將不可見。 然而,這種方法比上述方法更糟糕,也更丑陋。

僅僅測試公共接口可能是不夠的(通常不是),以便說您獲得了良好的測試覆蓋率,並且您的代碼易於維護和重構。

至於將私有方法標記為內部並且具有測試程序集,請參閱內部方法由於許多原因而不好

  1. 您的前私人方法在您的裝配中可見,因為它們是內部的
  2. 您將在產品的發布版本中具有測試特定邏輯(這些方法的內部僅用於測試目的),這很糟糕

而且我認為還有更多,但這些是最重要的

有趣的問題。 通常,單元測試旨在從類的使用者的角度驗證類的公共行為。 也就是說,只要你的班級信守承諾,消費者就不會在意這么做。

如果您真的需要將“私有”成員公開給單元測試,請將它們標記為內部並通過InternalsVisibleTo屬性訪問它們。 這很丑陋,但它確實有效,你可以稍后通過一些條件編譯將它從程序集中刪除。

你是對的,使用反射與使用PrivateObject模式有很多相同的陷阱。 更好的解決方案是避免嘗試專門測試私有方法。

如果您使用的是Gallio / MbUnit測試框架,則可以考慮使用內置的Mirror API。

有時,編寫測試最明顯的方法是訪問非公共狀態或行為。 它可能不是編寫測試的最佳方式,但它似乎是目前最簡單的解決方案。 MbUnit提供了幾個類來幫助訪問非公共成員。

暫無
暫無

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

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