2014-10-03 76 views
2

讓我解釋一下自己。如何對單元測試循環對象的函數?

function insertObjects($objs) { 
    foreach ($objs as $obj) { 
     $this->repository->insert($obj); 
    } 
} 

我不想測試插入數據庫的工作,因爲我認爲它工作(這是一個不同的單位)。我也不想測試foreach,因爲顯然foreach會起作用。所以這裏唯一要測試的是$ objs是一個格式良好的數組。但是如果$ objs是我將要傳入的模擬數據......那麼這是否意味着沒有什麼可以測試這個函數呢?

+1

我猜存儲庫是'insertObjects'的外部依賴項方法,因此您可以測試'Repository :: insert()'方法是否被稱爲_n_(數組大小)次。 – Crozin 2014-10-03 06:25:40

+0

我喜歡這個想法,但在實踐中感覺非常多餘。如果我有一個n項的數組,並且我在foreach循環中遍歷它們,那麼它當然會被調用n次。假設構造(foreach)是一個已經進行過單元測試的獨立單元。 – allenylzhou 2014-10-03 06:29:25

+1

你需要模擬'$ this-> repository'。首先你應該閱讀[嘲笑](https://phpunit.de/manual/current/en/test-doubles.html)。如果您還有其他問題,我可以幫助 – hek2mgl 2014-10-03 06:30:22

回答

1

如果有任何輸入無效的機會(一個格式不正確的數組,空值等),您需要通過明確地檢查它來處理您的方法中的情況。

在您的測試,你會再嘗試打電話給你的方法有各種無效的值,並檢查你的方法是否正確響應,即數據庫插入方法不叫,引發異常,記錄錯誤等

除此之外,唯一要測試的是數據庫插入方法是否使用與您傳入的有效測試數組中的值對應的參數調用。

+0

你說得對,我可以檢查輸入數組的功能。至於測試我的數據庫插入方法是否用正確的參數調用...我將如何測試這個單元測試?它可能會在存儲庫插入的單元測試中進行測試。 – allenylzhou 2014-10-03 06:32:08

+0

您需要模擬您的資源庫對象,並根據大小寫(有效或無效輸入)檢查模擬是否使用期望值調用,或根本不調用。 – 2014-10-03 06:32:53

+1

所有的細節都在[本頁](https://phpunit.de/manual/current/en/test-doubles.html)。開始閱讀標題爲* Mock objects *的部分。 – 2014-10-03 06:46:31