簡體   English   中英

對更新私有成員的公共無效方法進行單元測試

[英]unit testing on public void method which updates private member

我有以下公共無效方法:

public void Reset()
{
   // Get updates
   // update logic for each value in _dict
}

_dict是該類的私有成員:

private readonly dictionary<string, string> _dict;   

如何對Reset()方法的更新邏輯執行單元測試? 重置后如何驗證_dict中的值正確? 我不想為_dict設置公開的獲取方法。

我正在使用xunit和C#。

我很粗魯,所以我認為您應該嘗試TDD,因為它可以有效地防止無法測試的設計。

在您的特定情況下,我們沒有完整的故事。 從類外部應該可以觀察到Reset()的效果,否則就不需要該方法了。

現在,我不得不猜測調用Reset()可能會產生太多可觀察到的效果,因此對它們全部進行測試將很痛苦。 我建議將您的課程分為兩類,一類具有“功能性”,另一類具有“重置”功能。 這樣,在可Reset()的類上調用Reset()所有效果將是可見的,您可以對其進行測試,並且沒有其他私有成員在Reset()和您所擁有的任何功能之間傳遞信息的風險。

更新:總是按照馬克·西曼的指示做,因為他總是正確的:)

可以使用類的公共接口測試Reset()效果,這些效果可以觀察到。 專用字段和方法是實現細節,您永遠不要直接對其進行測試。

編寫單元測試的主要目標之一是能夠在不改變可見行為的情況下修改實現。 如果您測試私有字段或方法,則重構將破壞您的測試。 一段時間后,您將完全停止重構,或者將進行一系列紅色測試。

因此,問問自己自己為什么將public Reset()方法添加到類中? 為什么您班的客戶會調用此方法?

例如,如果您使用私有字典來實現某種緩存,並且Reset()方法清除緩存,請模擬存儲庫並測試在調用Reset()之后是否獲得了新數據。

如果找不到方法來測試使用類的公共接口調用它的效果,則不需要此方法。 刪除它。 更少的代碼=易於維護。

也許您可以使用模式Test Specifc子類,擴展該類並公開私有成員,或者創建一個公開結果的公共方法。

更多信息: http : //xunitpatterns.com/Test-Specific%20Subclass.html

希望這可以幫助。

暫無
暫無

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

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