我正在尝试在Slim PHP应用程序中为单个函数编写一个简单的单元测试。该函数使用mkdir()创建目录,并且我希望测试断言该目录已成功创建。使用前端应用程序进行测试时,将成功创建该文件夹,但是在运行测试时,找不到目录
1)TestController :: testCreate mkdir():没有这样的文件或目录
我们正在使用以下方法自动加载类:
//composer.json
"autoload": {
"psr-4": {
"App\\": "app",
"tests\\": "tests/"
}
}
这是创建目录的功能:
//Controllor.php
public function create($request, $response){
mkdir("../public/folder");
}
使用应用程序,这将在预期的以下位置创建目录
-app
-public/folder
这是测试功能的示例:
//TestController.php
public 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,并尝试在TestController.php中手动设置$_SERVER['DOCUMENT_ROOT']
如何在运行TestController.php时自动加载名称空间,以使create()函数从正确的位置调用mkdir()?
答案 0 :(得分:1)
好吧,这是一个小问题,一个大问题。
小-您正在丢失上下文,特别是工作目录。因此,不清楚目录的创建位置以及该位置是否可写。为了克服这个问题,我将创建一个可配置的值-应该发生情况的目录名称。对于实际用例,我将提供$ _SERVER ['DOCUMENT_ROOT'](或其他合适的值),对于测试,我将使用/tmp
(或更好的sys_get_temp_dir()
)。
为了更好地说明第一个问题(您要问的问题):
array_keys()
个函数可用” 更大的一个-这不是单元测试,因为您正在检查代码如何与某些外部实体(在本例中为文件系统)交互。这是一项功能测试。要使其成为单元测试,您需要模拟mkdir()
,并且需要将其抽象到某些接口之后,如下所示:
interface DirMaker {
public function mkdir($name);
}
该接口的实现也可以处理配置。并且在测试中,您可以提供一个模拟程序,该模拟程序可以像预期的那样确认mkdir()
被调用的事实。
答案 1 :(得分:1)