【问题标题】:Slim/Http/Environment not found in PHPUnit test在 PHPUnit 测试中找不到 Slim/Http/Environment
【发布时间】:2018-06-06 13:50:33
【问题描述】:

我正在使用Slim/Composer 开发一个API,我目前正在尝试使用PHPUnit 实现一些单元测试。当我通过命令行运行测试时,我一直遇到错误:

Fatal error: Class 'Slim\Http\Environment' not found
in C:\workspace\client\website\client\api\client-api\src\testclasses\dao\GenreDaoTest.php
on line 15

我的 composer.json 看起来像这样:

{
    "require": {
        "slim/slim": "^3.1",
        "slim/php-view": "^2.0",
        "monolog/monolog": "^1.17",
        "robmorgan/phinx": "^0.5.1",
        "firebase/php-jwt": "^5.0",
        "vlucas/phpdotenv": "^2.4",
        "tuupola/slim-jwt-auth": "^2.3"
    },
    "autoload": {
        "psr-4": {
            "": ["classes/dao",
                 "classes/controller",
                 "classes/app",
                 "testclasses/dao"]
        }
    },
    "require-dev": {
        "phpunit/phpunit": "^5.7"
    }
}

我的测试类如下所示:

<?php

use \Slim\Http\Environment as Environment;
use \Slim\Http\Request as Request;
use \Slim\Http\Response as Response;

class GenreDaoTest extends \PHPUnit_Framework_TestCase {

   public function testTemp() {
      $this->assertEquals(0, 0);
   }

   public function testGenres() {

      $environment = Environment::mock([
         'REQUEST_METHOD' => 'GET',
         'REQUEST_URI' => '/api/v1/genres'
      ]);

      $request = \Slim\Http\Request::createFromEnvironment($environment);
      $response = new Response();

      $this->assertEquals('test', 'test');
   }
}
?>

如果我注释掉整个第二个测试,留下 use 语句,第一个测试将毫无问题地通过。我想这可能与测试文件的位置有关,所以我将它移到了 classes/app 目录,在那里我有其他具有类似导入的类,我看到了相同的结果,所以我不 认为文件所在的位置存在问题。

我能想到的唯一两件事是,当我通过命令行 ($phpunit src/testclasses/dao/GenreDaoTest.php) 运行测试时发生了一些事情,或者我的 Composer 设置有问题。

我通常是一名 Java 工程师,所以我可能在 PHP 领域也缺少一些简单的东西 :)

有人有什么建议吗?非常感谢!

(另外,我知道我可能不应该在 DAO 测试中测试 API 请求/响应,我正在重构)

【问题讨论】:

  • 你有require 'vendor/autoload.php';吗?
  • 您是否使用--bootstrap vendor/autoload.php 运行了phpunit?这是必要的,因此可以在需要时发现类文件。
  • @Nima 这就是问题所在。它在我运行时起作用: phpunit --bootstrap src/vendor/autoload.php src/testclasses/dao/GenreDaoTest.php 应该注意的是,这仅在我使用 --bootstrap src/vendor/autoload.php 测试前有效班级。最后它不适用于 --bootstrap src/vendor/autoload.php。
  • 所以我会发布一个答案来解释这个问题:)
  • 你也可以在你的 phpunit.xml 中引用 boostrap 文件。也许也可以将其添加到答案中。

标签: php unit-testing phpunit composer-php slim


【解决方案1】:

使用phpunit 时,您可以告诉它在运行测试之前包含vendor/autoload.php。为此,您可以更改 phpunit.xml 以包含以下内容:

<phpunit bootstrap="./vendor/autoload.php">
    ...
</phpunit>

或者您可以在从命令行调用时将--bootstrap vendor/autoload.php 传递给phpunit 命令:

phpunit --boostrap vendor/autoload.php <tests directory>

在测试执行部分下的PHPUnit documentations 中阅读更多信息。
我还建议阅读this question 及其答案。

【讨论】:

    【解决方案2】:

    我正在使用 Slim 4 并且遇到了同样的问题。

    我变了:

    use \Slim\Http\Request as Request;
    

    通过

    use Slim\Psr7\Environment;
    

    为我工作!!!

    【讨论】:

    • 我这样做了,我得到了Error: Class 'Slim\Psr7\Environment' not found 这可能取决于安装选项吗?我正在使用nyholm/psr7 包......那么,有一个可以使用的环境吗?我猜,我看不懂
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2021-09-01
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    相关资源
    最近更新 更多