php單元測試進(jìn)階(6)- 核心技術(shù) - 樁件(stub)

php單元測試進(jìn)階(6)- 核心技術(shù) - 樁件(stub)

本系列文章主要代碼與文字來源于《單元測試的藝術(shù)》,原作者:Roy Osherove。譯者:金迎。

本系列文章根據(jù)php的語法與使用習(xí)慣做了改編。所有代碼在本機(jī)測試通過。如轉(zhuǎn)載請注明出處。
一個樁件(stub)是對系統(tǒng)中存在的一個依賴項(或者協(xié)作者)的可控制的替代物。通過使用樁件,你在測試代碼時無需直接處理這個依賴項。

讓我們把前面的LogAnalyzer日志分析類實(shí)現(xiàn)得更加復(fù)雜。
LogAnalyzer類的應(yīng)用程序可以配置成處理多個日志文件擴(kuò)展名,每種文件使用一個特殊的適配器。為簡單起見,我們可以假設(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類變的容易:抽取接口使底層實(shí)現(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)容
        // 這里為了簡略不寫,因為不是重點(diǎn)。
        return true;
    }
}

和被測類日志分析器類LogAnalyzer.php,代碼如下

<?php
namespace app\index\controller;

/**
 * 日志分析器類,也是被測類
 *
 */
class LogAnalyzer
{
    /**
     * 判斷文件名是否有效,調(diào)用另一個類來實(shí)現(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)源代碼讓文件管理器類實(shí)現(xiàn)此接口
(3)測試代碼得增加一個樁件實(shí)現(xiàn)接口
(4)日志分析器類得允許注入,無論是文件管理器類或是樁件,不能寫死。以便于測試。

文章太長了,下一篇給出全部代碼

額外說明,關(guān)于FileExtensionManager類的正確性,由集成測試保證,本系列文章只關(guān)注單元測試。

上一篇:php單元測試進(jìn)階(5)- 入門 - 異常測試
下一篇:php單元測試進(jìn)階(7)- 核心技術(shù) - 樁件(stub) - 構(gòu)造函數(shù)注入樁件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容