簡體   English   中英

單元測試是否使用特定驗證類進行實體驗證是不好的做法?

[英]Is it bad practice to unit test that a class uses a specific validation class for entity validation?

我通過我稱之為“命令”的類來運行我的所有操作。 為了說明這一點,要創建一個新用戶,我將調用以下代碼

new CreateUserCommand(unitOfWork).SetName("Username").SetPassword("Blah").Execute();

我現在正在考慮在這個系統中實現驗證,以驗證諸如密碼是一定長度,用戶名在數據庫中不是重復的事情等等...

為了解決這個問題,我正在考慮使用流暢的驗證並為我想要的每種類型的實體驗證實體創建驗證類。 例如,我會有一個類,如

public class NewUserValidation : ValidationFor<User>
{
   public NewUserValidation() 
   {
     // Validation Rules here
   }
}

在其自己的類中創建驗證的一個優點是我可以對多個命令使用相同的驗證規則(例如,編輯和創建公司可以使用相同的驗證規則)。

現在,每個驗證類都將具有與之關聯的單元測試。 但是,我試圖弄清楚如何處理使用這些驗證類的命令類的單元測試。

例如,在為命令類創建測試時,我是否會為該類的每個驗證規則創建單獨的測試(因此基本上為每個命令類重復驗證類本身的所有單元測試我計划使用相同的驗證類)? 這會產生很多開銷,特別是當我已經知道驗證類因為對它們進行單獨的單元測試而工作時。

我看到的唯一其他選項是在包含驗證類的命令中公開一個公共屬性,然后我將單元測試該命令的驗證類是預期的驗證類。 這個方法的問題是我需要設計一些方法來驗證我的Execute()方法實際上是在運行驗證類(否則無法知道驗證是否正在運行)。

我仍然傾向於后一種測試方法,只是為了幫助降低開銷,但我確實需要找到一個解決方案來檢查驗證是否實際運行。 這會是一個不好的方式,而且我會更好地選擇以前的風格嗎?


編輯 :要回答下面兩個答案,確認會在內部使用Execute()方法,通過一個validator.Validate(entity)呼叫的實現Execute()

雖然我不想違反DRY,但我沒有看到一種簡單的方法來驗證Execute() 1)默認使用正確的驗證類,2)實際調用驗證類的.validate(entity)方法。

我可以通過在構造函數中實例化驗證類來解決#1,並通過命令類的公共屬性公開它,但我不確定如何在不重復單個驗證單元測試的情況下正確地對第二個問題進行單元測試。

您已經測試了驗證器類的功能。 因此,對這些命令類進行測試的唯一方法是它們實際使用驗證器。

由於您計划如何使用這些驗證器並不明顯,因此很難說如何做到這一點。 復制每個命令的測試用例是最有效的方法,但最終,它可能被證明是測試驗證器存在的唯一方法。


編輯:從你最近的添加,這看起來像使用模擬對象的完美候選人。

要測試Execute方法,可以模擬驗證器,並驗證是否調用了它們的validate方法。 要測試命令構造,可以模擬命令對象,並檢查是否將相應的驗證器傳遞給它。

您可能想看看這個問題 (stackoverflow.com)。 您可能需要按摩您的設計,以便您可以使用模擬框架。


編輯:還看看這個問題 (stackoverflow.com)。 它似乎滿足您的要求。 微軟工具Moles (microsoft.com)看起來非常有趣。

你幾乎從不想要違反DRY,所以我認為重復每個引用類的單元測試是絕對錯誤的。 我真的不明白你對驗證Execute方法正在運行驗證類的擔憂。 那不應該是Execute方法的單元測試嗎? 一旦你測試了這個,為什么你需要專門針對每種類型的驗證類進行測試?

最后,我不確定為什么你需要“測試命令的驗證類是預期的驗證類。” 聽起來你正在測試工廠而不是實際的Command類。

我只會對Command類直接負責的事情進行單元測試。 如果Command類創建它自己引用的驗證類,那么你可以對它進行單元測試。 但根據您提供的信息,這聽起來確實不對。

如果我是你,我創建一個validationFalingTest ,你執行一個包含無效數據的命令。

此測試確保該命令具有有效的驗證 在我看來,驗證是否有正確的驗證類實例是針對具體的實現。

暫無
暫無

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

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