我有一個類處理帳戶的東西。它提供了登錄,重置密碼和創建新賬戶的方法。TDD - 我做得對嗎?
我通過構造函數注入依賴關係。我有驗證每個依賴項的引用的測試,如果引用爲null,它會引發一個ArgumentNullException。
Account類通過只讀屬性公開每個這些依賴關係,然後我有測試來驗證在構造函數上傳遞的引用是否與屬性返回相同。我這樣做是爲了確保參考資料是由班級持有的。 (我不知道這是否也是一種好的做法。)
第一個問題:這是TDD的一個好習慣嗎?我問這個,因爲這個類到目前爲止有6個依賴關係,並且它非常重複,而且測試也很長,因爲我必須模擬每個測試的所有依賴關係。我所做的只是每次複製和粘貼,只需更改正在測試的依賴項的引用即可。第二個問題:我的賬戶創建方法執行如驗證通過的模型,將數據插入3個不同的表或第四個表(如果存在某組值併發送電子郵件)。我應該在這裏測試什麼?到目前爲止,我有一個測試,檢查模型驗證是否得到執行,如果調用每個存儲庫的Add方法,並且在這種情況下,我使用模擬存儲庫的Moq的回調方法來比較每個添加到存儲庫的屬性我通過模型傳遞的。
喜歡的東西:
userRepository
.Setup(r => r.Add(It.IsAny<User>()))
.Callback<User>(u =>
{
Assert.AreEqual(model.Email, u.Email);
Assert.IsNotNull(u.PasswordHash);
//...
})
.Verifiable();
正如我所說,這些測試越來越長,我認爲它不會傷害測試任何東西我可以,但我不知道這是值得的,因爲它編寫測試需要時間。
「這是很好的TDD嗎?」真的是錯誤的問題;更有用的問題是「這是否適合我和我的項目?」像TDD這樣的方法論,儘管有什麼狂熱分子會讓你覺得這是一種達到目的的手段,而不是自己的目的。 – Casey 2014-09-24 03:57:48
-1這不是一個TDD的問題,它是一個單元測試的設計問題。 – gurun 2014-09-26 13:58:28
這是我的2美分。我不會將您的依賴作爲屬性公開。我看到了這種被開發者濫用的事情。在過去他們使用依賴關係的屬性暴露他們的類內的依賴關係(根本不漂亮)。如果組裝SUT類變得單調乏味,可以使用工廠方法創建SUT類,或者更好地使用測試生成器模式。 – Andrew 2014-09-26 20:39:09