簡體   English   中英

單元測試PHP框架

[英]Unit testing a PHP Framework

我有一個自定義的Lightweight PHP框架,供我們公司使用。 首先,我不希望該建議使用第三方框架。 我正在嘗試為此編寫單元測試,但我偶然發現了一個問題。 我對單元測試還比較陌生,但是大多數代碼已經介紹了。

我有一個加載器類,它將要求無法使用類自動加載器加載的文件(例如,配置文件)。 它具有一種備用系統,如果您不指定從中加載特定資源的模塊,它將嘗試基於當前模塊,然后是默認模塊進行猜測。 這要求我(據我所知)必須先檢查特定文件的存在,然后才能還原為默認文件。

我遇到的問題是為該類編寫實際上不依賴於任何現有文件的測試(這顯然是可取的)。 我已經閱讀了有關虛擬文件系統和測試的信息,但是在查看如何利用它解決問題時遇到了麻煩。

我可以編寫一個注入到該類中的文件系統的抽象,但是該類將有一個類似的問題。

用偽代碼:如果文件存在於此模塊中,則將其加載; 如果不是,請加載默認值。

任何建議,不勝感激。

編輯:

這是一段代碼摘錄:

class Base implements Loader {

...

protected function _include( $type, $name ){
    $identifier = $this->parseName($name);

    $path = '/'.$this->resource_types[$type]['directory'].'/'.$this->resource_types[$type]['file_prefix'].$identifier['name'].'.php';

    if( $identifier['module'] && is_file(Core::basePath().'/'.Constant::get('MODULE_PATH').'/'.$identifier['module'].$path) ){
        Core::requireRoot('/'.Constant::get('MODULE_PATH').'/'.$identifier['module'].$path);

    } else if( is_file(Core::basePath().'/'.Constant::get('CORE_PATH').$path) ){
        Core::requireRoot('/'.Constant::get('CORE_PATH').$path);

    } else {
        throw new Exceptions\Load(ucwords($type).' '.$name.' not found');
    }
}

....

}

這是一個非常低級的類,因此它具有一些靜態調用,這些調用基本上可以代替或包裝原生PHP函數。 Core::requireRoot只是本機require函數的包裝。 Constant::getConstant::get的自定義實現(可以define ,然后直接使用常量)。 請記住,我實際上並沒有直接測試此方法。 我有一些實際的測試方法,例如loadHooks ,它們實際上正在測試中,因此會在后台調用該方法。

感謝@ hek2mgl和(在較小程度上)@deceze(對我的靜態調用正確的人),我有一個解決此問題的方法。 這並不是我最初希望的解決方案,但是我認為這是可以做到的最好的解決方案。 開始。

我將根據@ hek2mgl的建議在這里使用臨時文件(github.com/metashock/Jm_Autoloader)。 我認為即使使用文件系統抽象對象,也無法解決此問題。 這就是說, 要使用一個文件系統抽象對象,我會注入到這個類,因為它會使在其他情況下更容易地重新使用臨時文件替換。

我將刪除該函數中的靜態調用(我比做的要好,但是可以很容易地說服自己“這是一個低級的類,實際上並不重要”)。 相反,我將為CORE_PATH和MODULES_PATH創建getter和setter方法,並恢復為require的本機調用。 不需要使用新的文件系統對象來完成此操作,但是我認為它更干凈,更靈活且耦合更松散。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM