2014-04-04 55 views
1

我有這樣的功能:模擬了刪除Zend框架的單元測試功能2

<?php 

function deleteFromDb(array $where) 
{ 
    $sql = new Sql($this->dbAdapter); 
    $delete = $sql->delete(); 
    $delete->where($where); 
    $statement = $sql->prepareStatementForSqlObject($delete); 

    return $statement->execute(); 
} 

如何嘲笑這個功能在Zend框架2單元測試?

回答

0

就像沒有Zend Framework一樣 - 通過自己編寫模擬或者通過模擬框架(如Mockery)動態生成它。

但我不明白爲什麼你需要嘲笑這段代碼。沒有if-else操作符,沒有循環,沒有異常拋出 - 這是非常簡單的方法,所以你可以100%確定所有的方法都將以相同的方式和相同的次數在任何可能的情況下被調用。所以嘲笑這個功能沒有任何好處。

雖然單元測試這個函數必須被存根,所以這個函數的替代實現將隨時返回不變的結果。在集成測試中,您無需以任何方式模擬/存儲此函數 - 只需檢查實際結果值即可。

+0

如果嘲笑這個功能是沒用的,那麼我如何確保從數據庫中刪除記錄的工作好還是不好? – Dante

+1

在集成測試?這很簡單!執行此函數後,請檢查SELECT返回的行是否具有相同的WHERE條件 - 它們不得返回。 :)你不能完全通過嘲笑來保證這一點。 Mocks的唯一目的是檢查「所有必須執行的函數是否已經執行」。基本上,你可以模擬在這段代碼中使用的「Sql」類,並檢查「刪除」命令是否真的發送到數據庫引擎,但測試複雜,也不能保證任何真正的東西。 – rufanov

+1

也是大多數標準的自動寫入方式針對數據庫引擎的集成測試基於事務。在安排部分測試代碼創建新事務並插入一些(隨機或靜態)數據(確保在測試時所需的數據將存在於數據庫中),在測試中的行爲部分函數中對這些數據做一些動作,聲明部分測試代碼檢查預期的操作是否完成。這就是全部功能 - 檢查它是否「做需要做的事情」,並且實際數據改變了,因爲我們在測試結束時沒有提交測試事務。 :) – rufanov