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

我正在尝试为我的 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 并尝试$_SERVER['DOCUMENT_ROOT']在 TestController.php 中手动设置


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


喵喔喔
浏览 167回答 2
2回答

慕婉清6462132

嗯,有一个小问题和一个大问题。小的——你正在失去上下文,特别是工作目录。因此,不清楚您的目录在哪里创建,以及该位置是否实际上可写。为了克服这个问题,我会创建一个可配置的值——一个应该发生事情的目录名称。对于实际用例,我会提供 $_SERVER['DOCUMENT_ROOT'] (或任何其他合适的值),对于我会使用的测试/tmp(或更好sys_get_temp_dir())。为了更好地说明第一个问题(您要问的问题):目前您的代码假设了一些关于运行环境的假设,并且该假设不是一个安全的假设,例如“总是有array_keys()可用的功能”将此类假设转换为可配置值是一种很好的做法使其可配置也使测试更容易,因为您的测试环境与您的生产/开发/登台环境分离更大的一个——这不是一个单元测试,因为你正在检查你的代码如何与一些外部实体交互,在这种情况下是文件系统。这是一个功能测试。要进行单元测试,您需要模拟mkdir(),为此您需要将它抽象到一些像这样的接口后面:interface DirMaker {    public function mkdir($name);}该接口的实现也可以处理配置。在测试中,您可以提供一个模拟,它只承认mkdir()被调用的事实,正如预期的那样。

www说

你有多种选择使用vfsStream可以模拟文件系统。适用于所有 PHP 函数,如 mkdir、file_exists 等...使用Flysystem作为文件系统的抽象库。使用 Null Adapter 进行测试。创建一个自定义接口并为测试实现一个真正的文件系统类和一个内存中模拟类。
打开App,查看更多内容
随时随地看视频慕课网APP