簡體   English   中英

關於私人方法的單元測試的問題

[英]Questions on unit testing of private methods

在MSTest中, [Shadowing]屬性可幫助您從另一個程序集中對單個方法進行單元測試。 以下是相關鏈接: VS在生成單元測試時使用的Shadowing屬性是什么?

我的問題是:

  1. 私人方法應該單獨進行單元測試嗎?
  2. 將私有方法的訪問者更改為internal只是為了使其可用於某些其他測試項目/程序集中的單元測試,這是一種很好的(?)實踐嗎? (使用InternalsVisibleTo
  3. 如果通過調用它們的公共方法間接測試私有方法,它可以稱為“單元”測試嗎?
  1. 不,不應該測試私有方法。 您的應用程序僅與公共API交互。 因此,您應該測試您的類的預期行為以進行此交互。 私有方法是內部邏輯實現的一部分。 你班上的用戶不應該關心它是如何實現的。
  2. 不,這不好。 往上看。 您應該只測試公共API。
  3. 您應該只測試公共方法。 您不關心公共方法是否會調用私有方法,或者在測試通過之前不會。 如果測試失敗,請修復實現。 但是不要測試私有方法。

更新(如何定義要測試的內容):理想情況下(在測試優先方法中)測試是您班級的第一個用戶。 當您編寫測試時,您會嘗試想象用戶將如何使用您的課程。 用戶不會與私人方法交互(反思是作弊)。 因此,作為您班級的第一個用戶,您的測試不應與私有方法交互。

簡要回答一下你的問題:

  1. 一般來說,他們不應該。 大多數情況下,您的私有位將在測試類合同/公共API時進行測試。 對於時間這是不可能的,測試私有方法就像其他任何東西一樣是單元測試。

  2. 這很常見。 雖然改變可見性可能被認為是壞主意,但當它僅僅改變為內部時,它並沒有那么糟糕。 然而,在像TDD這樣的方法中,測試的需要通常會以這樣的方式驅動你的設計,以至於不需要這樣的“黑客”。 但就像我說的那樣,這是相當普遍的 - 你不應該過多擔心它,除非它達到荒謬的程度(比如暴露的整個私人部分)。

  3. 它是單元測試,只要它測試你的類的單個單元 (或一個邏輯概念 )。 私有方法通常是作為公共部分重構的結果而創建的,大部分時間都是單個單元測試的目標。 如果您覺得您的私有方法不再是一個單元 ,那么它可能是一個重構調用。

另外,我建議看看這里這里這里

我希望通過公共可用的電話來運用所有私人方法。 必須有一條路徑來執行公共呼叫中的每條專線,如果不存在,您可以刪除該代碼。

使用內部而不是私有可能會以一個大混亂結束,我不會使用這種方法。

作為Java開發人員,我這樣做。 我也沒有改變訪問級別。 我使用反射來訪問私有方法。 我不必將它授予我的用戶,而且我不必向他們展示我的單元測試。

這是Java的一個骯臟秘密:您始終可以通過反射來規避訪問限制。 我不知道C#和.NET是否也是如此,但你可以查看它。

暫無
暫無

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

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