我正在嘗試為我的 Slim PHP 應用程序中的單個函數編寫一個簡單的單元測試。該函數使用 mkdir() 創建一個目錄,我希望測試斷言該目錄已成功創建。使用前端應用程序測試時,文件夾創建成功,但運行測試時,找不到目錄1) TestController::testCreate mkdir(): 沒有那個文件或目錄我們使用以下方法自動加載類://composer.json "autoload": { "psr-4": { "App\\": "app", "tests\\": "tests/" } }這是創建目錄的函數://Controllor.phppublic function create($request, $response){ mkdir("../public/folder");}使用該應用程序,這會按預期在以下位置創建一個目錄-app-public/folder這是測試功能的示例://TestController.phppublic function testCreate(){ $controller = new Controller($this->container); $request = $this->requestFactory(); $response = new \Slim\Http\Response(); $response = $controller>create($request, $response, []); //Assertions below..}我正在使用 phpunit.xml 通過將 bootstrap="vendor/autoload.php" 插入配置文件來引導 autoload.php 文件。我還嘗試從 TestController.php 中要求 vendor/autoload.php 并嘗試$_SERVER['DOCUMENT_ROOT']在 TestController.php 中手動設置如何在運行 TestController.php 時自動加載命名空間,以便 create() 函數從正確的位置調用 mkdir()?
2 回答
慕婉清6462132
TA貢獻1804條經驗 獲得超2個贊
嗯,有一個小問題和一個大問題。
小的——你正在失去上下文,特別是工作目錄。因此,不清楚您的目錄在哪里創建,以及該位置是否實際上可寫。為了克服這個問題,我會創建一個可配置的值——一個應該發生事情的目錄名稱。對于實際用例,我會提供 $_SERVER['DOCUMENT_ROOT'] (或任何其他合適的值),對于我會使用的測試/tmp(或更好sys_get_temp_dir())。
為了更好地說明第一個問題(您要問的問題):
目前您的代碼假設了一些關于運行環境的假設,并且該假設不是一個安全的假設,例如“總是有
array_keys()可用的功能”將此類假設轉換為可配置值是一種很好的做法
使其可配置也使測試更容易,因為您的測試環境與您的生產/開發/登臺環境分離
更大的一個——這不是一個單元測試,因為你正在檢查你的代碼如何與一些外部實體交互,在這種情況下是文件系統。這是一個功能測試。要進行單元測試,您需要模擬mkdir(),為此您需要將它抽象到一些像這樣的接口后面:
interface DirMaker {
public function mkdir($name);
}
該接口的實現也可以處理配置。在測試中,您可以提供一個模擬,它只承認mkdir()被調用的事實,正如預期的那樣。
- 2 回答
- 0 關注
- 187 瀏覽
添加回答
舉報
0/150
提交
取消
