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