簡體   English   中英

如何指定只能通過單元測試調用方法?

[英]How do you specify that a method can only be called by unit tests?

如何限制用戶調用僅用於單元測試的方法? 如果調用不是在單元測試的上下文中,我想考慮拋出一個異常,但我不知道測試是否有類似“DEBUG”的符號用於在調試下構建的項目。

我可以使用它的一個例子是DTO及其身份。 要正確模擬持久的DTO,我需要為我將要使用的實體分配一個Id。 我可以通過添加方法或為特定目的添加構造函數來做到這一點,但我希望明確指出,將Id分配給實體應僅可用於單元測試,而不應該在實際代碼本身上完成。

通常,不建議僅使用單元測試調用的方法。 理想情況下,被測代碼在單元測試中的行為不應與現實世界中的行為不同。 也就是說,有時這樣的技巧是不可避免的,例如,當試圖編寫遺留代碼的測試時,這些代碼從未設計為可單元測試的。

即使在這種情況下,“僅測試”方法應該是臨時捷徑,而不是長期解決方案。 所以我不會太擔心檢測是否從外部單元測試中調用該方法。 相反,一旦我將代碼完全覆蓋了測試,努力重構它以擺脫“僅測試”方法和其他臨時腳手架,努力實現更清潔和更安全的設計。

如果您更多地了解您的方法的實際含義,我們可能會提供更具體的建議。

關於該主題的推薦閱讀材料是與遺留代碼有效合作

更新

謝謝你的解釋。 我們在遺留項目中的幾個地方也有這樣的檢查,所以我知道有時它是不可避免的。 幸運的是,我們還不需要為這些地方編寫單元測試(好吧,如果沒有單元測試我們代碼中的唯一地方,我會非常高興的:-)。

我想到了一個替代解決方案: 將實體ID檢查提取到單獨的(虛擬)方法 (可能在單獨的接口中)並在單元測試中覆蓋/模擬。 這樣,只需幾行額外代碼即可消除對僅測試方法的需求。 希望這可以幫助 :-)

如果場景需要它,添加[asembly:InternalsVisibleTo(...)]屬性(指定測試程序集的詳細信息)可以允許您的測試代碼通常訪問私有方法等; 但是,如果可能,最好避免這種情況。

MSDN 有一個例子

暫無
暫無

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

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