PHPUnit测试失败,因为文件路径位置不正确

PHPUnit测试失败,因为文件路径位置不正确,php,testing,phpunit,slim,autoload,Php,Testing,Phpunit,Slim,Autoload,我正在尝试为我的Slim PHP应用程序中的单个函数编写一个简单的单元测试。该函数使用mkdir()创建一个目录,我希望测试断言该目录已成功创建。使用前端应用程序进行测试时,会成功创建文件夹,但在运行测试时,找不到目录 1) TestController::testCreate mkdir():没有这样的文件或目录 我们使用以下命令自动加载类: //composer.json "autoload": { "psr-4": { "App\\": "a

我正在尝试为我的Slim PHP应用程序中的单个函数编写一个简单的单元测试。该函数使用mkdir()创建一个目录,我希望测试断言该目录已成功创建。使用前端应用程序进行测试时,会成功创建文件夹,但在运行测试时,找不到目录

1) TestController::testCreate mkdir():没有这样的文件或目录

我们使用以下命令自动加载类:

//composer.json
    "autoload": {
        "psr-4": {
            "App\\": "app",
            "tests\\": "tests/"
        }
    }
这是创建目录的函数:

//controller.php
公共函数创建($request$response){
mkdir(“../public/folder”);
}
使用该应用程序,这将按预期在以下位置创建一个目录

-app
-public/folder
这是测试功能的一个示例:

//TestController.php
公共函数testCreate(){
$controller=新控制器($this->container);
$request=$this->requestFactory();
$response=new\Slim\Http\response();
$response=$controller>create($request,$response,[]);
//下面的断言。。
}
我使用phpunit.xml在配置文件中插入bootstrap=“vendor/autoload.php”,以引导autoload.php文件

我还尝试从TestController.php中要求供应商/autoload.php,并尝试在TestController.php中手动设置
$\u服务器['DOCUMENT\u ROOT']


如何在运行TestController.php时自动加载名称空间,以便create()函数从正确的位置调用mkdir()

小的一个--您失去了上下文,特别是工作目录。因此,不清楚创建目录的位置,以及该位置是否可写。为了克服这个问题,我将创建一个可配置的值——一个应该发生事情的目录名。对于实际用例,我会提供$\u SERVER['DOCUMENT\u ROOT'](或任何其他合适的值),对于测试,我会使用
/tmp
(或者更好的
sys\u get\u temp\u dir()

为了更好地回答第一个问题(您正在询问的问题):

  • 目前,您的代码对运行环境进行了一些假设,但这种假设并不安全,例如“始终存在可用的
    array\u keys()
    函数”
  • 将这些假设转换为可配置的值是一个很好的做法
  • 使其可配置也使得测试更加容易,因为您的测试环境与prod/dev/staging环境是解耦的
更大的一点——这不是单元测试,因为您要检查代码如何与外部实体(在本例中为文件系统)交互。这是一个功能测试。要进行单元测试,您需要模拟
mkdir()
,要做到这一点,您需要将其抽象到如下一些接口后面:

interface DirMaker{
公共函数mkdir($name);
}

该接口的实现也可以处理配置。在测试中,您可以提供一个模拟,它只承认调用了
mkdir()
,这一事实,正如预期的那样。

您有多个选项

  • 使用它可以模拟文件系统。适用于所有PHP函数,如mkdir、file_exists等
  • 用作文件系统的抽象库。使用空适配器进行测试
  • 为测试创建一个自定义接口并实现一个真正的文件系统类和一个内存中的模拟类