php單元測試進(jìn)階(6)- 核心技術(shù) - 樁件(stub)
本系列文章主要代碼與文字來源于《單元測試的藝術(shù)》,原作者:Roy Osherove惰聂。譯者:金迎疆偿。
本系列文章根據(jù)php的語法與使用習(xí)慣做了改編咱筛。所有代碼在本機測試通過。如轉(zhuǎn)載請注明出處杆故。
一個樁件(stub)是對系統(tǒng)中存在的一個依賴項(或者協(xié)作者)的可控制的替代物迅箩。通過使用樁件,你在測試代碼時無需直接處理這個依賴項反番。
讓我們把前面的LogAnalyzer日志分析類實現(xiàn)得更加復(fù)雜沙热。
LogAnalyzer類的應(yīng)用程序可以配置成處理多個日志文件擴展名,每種文件使用一個特殊的適配器罢缸。為簡單起見,我們可以假設(shè)程序支持的各種文件名作為應(yīng)用程序的配置文件存放在磁盤的某個地方投队,方法如下
public function isValidLogFileName($filename)
{
// 讀取某個配置文件枫疆,根據(jù)文件內(nèi)容決定$filename是否合法。
// ... ...
// php經(jīng)常使用file_get_contents這個函數(shù)讀取文件內(nèi)容敷鸦。息楔。
}
因為被測方法依賴了文件系統(tǒng),而單元測試不應(yīng)該與文件系統(tǒng)打交道(好處是極快扒披,且代碼通用值依,無環(huán)境依賴)
如何使測試LogAnalyzer類變的容易:抽取接口使底層實現(xiàn)可替換
需要增加一個間接層FileExtensionManager,現(xiàn)在碟案,t2\application\index\controller下有兩個文件愿险。
文件管理器類FileExtensionManager.php如下:
<?php
namespace app\index\controller;
/**
* 文件管理器類
*
*/
class FileExtensionManager
{
/**
* 根據(jù)某個配置文件的內(nèi)容判斷文件名是否有效
* @param string $filename
*/
public function isValid($filename)
{
// 會使用file_get_contents函數(shù)讀取某個文件的內(nèi)容
// 這里為了簡略不寫,因為不是重點价说。
return true;
}
}
和被測類日志分析器類LogAnalyzer.php辆亏,代碼如下
<?php
namespace app\index\controller;
/**
* 日志分析器類,也是被測類
*
*/
class LogAnalyzer
{
/**
* 判斷文件名是否有效鳖目,調(diào)用另一個類來實現(xiàn)
* @param string $filename
*/
public function isValidLogFileName($filename)
{
$mgr = new FileExtensionManager();
return $mgr->isValid($filename);
}
}
然而這么做還是遠(yuǎn)遠(yuǎn)不夠的扮叨。
源代碼現(xiàn)在有兩個類,
(1)源代碼還需增加一個isValid()接口领迈,
(2)源代碼讓文件管理器類實現(xiàn)此接口
(3)測試代碼得增加一個樁件實現(xiàn)接口
(4)日志分析器類得允許注入彻磁,無論是文件管理器類或是樁件,不能寫死狸捅。以便于測試衷蜓。
文章太長了,下一篇給出全部代碼
額外說明薪贫,關(guān)于FileExtensionManager類的正確性恍箭,由集成測試保證,本系列文章只關(guān)注單元測試瞧省。
上一篇:php單元測試進(jìn)階(5)- 入門 - 異常測試
下一篇:php單元測試進(jìn)階(7)- 核心技術(shù) - 樁件(stub) - 構(gòu)造函數(shù)注入樁件