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

时间:2019-06-20 12:07:12

标签: php testing phpunit slim autoload

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

2 个答案:

答案 0 :(得分:1)

好吧,这是一个小问题,一个大问题。

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

为了更好地说明第一个问题(您要问的问题):

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

更大的一个-这不是单元测试,因为您正在检查代码如何与某些外部实体(在本例中为文件系统)交互。这是一项功能测试。要使其成为单元测试,您需要模拟mkdir(),并且需要将其抽象到某些接口之后,如下所示:

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

该接口的实现也可以处理配置。并且在测试中,您可以提供一个模拟程序,该模拟程序可以像预期的那样确认mkdir()被调用的事实。

答案 1 :(得分:1)

您有多种选择

  1. 使用vfsStream可以模拟文件系统。与所有PHP函数(例如mkdir,file_exists等)配合使用都很好。
  2. 使用Flysystem作为文件系统的抽象库。使用Null适配器进行测试。
  3. 创建一个自定义界面,并为测试实现一个真实的文件系统类和一个内存中的模拟类。