【问题标题】:PHPUnit test fails because file path location is incorrectPHPUnit 测试失败,因为文件路径位置不正确
【发布时间】:2019-06-21 01:47:05
【问题描述】:

我正在尝试为我的 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()?

【问题讨论】:

    标签: php testing phpunit slim autoload


    【解决方案1】:

    嗯,有一个小问题和一个大问题。

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

    为了更好的单词优先问题(您要问的问题):

    • 目前您的代码假设一些关于运行环境的假设,并且该假设不是一个安全的假设,例如“总是有可用的 array_keys() 函数”
    • 将此类假设转换为可配置值是一种很好的做法
    • 使其可配置也使测试变得更加容易,因为您的测试环境与您的 prod/dev/staging 环境分离

    更大的——这不是一个单元测试,因为你正在检查你的代码如何与一些外部实体交互,在这种情况下是文件系统。这是一个功能测试。要使其进行单元测试,您需要模拟 mkdir(),为此您需要将其抽象到一些接口后面,如下所示:

    interface DirMaker {
        public function mkdir($name);
    }
    

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

    【讨论】:

      【解决方案2】:

      您有多种选择

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-10
        • 1970-01-01
        • 2019-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-09
        • 2012-10-19
        相关资源
        最近更新 更多