我對測試驅動開發相當新穎,我剛開始學習SOLID原則,所以我希望有人能幫助我。在開發TDD範例中的單元測試和方法的背景下,我對理解單一責任原則有一些概念性的困難。例如,假設我希望開發刪除從數據庫 - 一個項目之前,我的代碼看起來會像下面的方法...單一責任原則,測試驅動開發和功能設計
我會用定義測試用例開始:
"Delete_Item_ReturnsTrue": function() {
//Setup
var ItemToDelete = "NameOfSomeItem";
//Action
var BooleanResult = Delete(ItemToDelete);
//Assert
if (BooleanResult === true) {
return true;
} else {
console.log("Test: Delete_Item_ReturnsTrue() - Failed.");
return false;
}
}
我運行測試,以確保它失敗了,那麼我會制定方法...
function Delete(ItemToDelete) {
var Database = ConnectToDatabase();
var Query = BuildQuery(ItemToDelete);
var QueryResult = Database.Query(Query);
if (QueryResult.error !== true) {
//if there's no error then...
return true;
} else {
return false;
}
}
如果我理解正確的單一職責原則,我原來寫的方法有責任刪除該項目並返回true,如果沒有錯誤。所以,如果我按照SOLID範式的原始方法需要重構看起來像...
function Delete(WhatToDelete, WhereToDeleteItFrom) {
WhereToDeleteItFrom.delete(WhatToDelete);
}
做設計本身,改變了我的方法從布爾函數void函數所以現在我不能以我測試舊方法的相同方式真正測試新方法。
我想我可以測試拋出的異常,但然後不會使它成爲一個集成測試,而不是單元測試,因爲沒有實際的異常拋出該方法?
我是否設計並實現了一個額外的函數來檢查數據庫以用於我的單元測試?
難道我只是不測試它,因爲它是無效的? TDD的工作原理如何?
我是否傳入模擬存儲庫,然後在狀態發生變化後將其返回?難道這不就是讓我回到原點嗎?
我是否傳入對模擬存儲庫的引用,然後在方法完成後僅對存儲庫進行測試?那不會被認爲是副作用嗎?