Laravel 5 单元测试中未找到特征

Trait not found inside Laravel 5 unit tests

我正在编写一些单元测试来测试我的 Laravel 5 应用程序中的 API 端点,许多端点需要用户身份验证。我不想在每个测试中都使用相同的用户帐户创建代码,而是想定义一个 RegistersUsers 特征以用于测试 类,它将有一个 registerUser() 方法。

我的tests目录的目录结构是这样的:

/tests
    /Traits
        RegistersUsers.php
    TestCase.php
    UserTest.php

我通过添加此命名空间声明为 TestCase.phpUserTest.php 命名空间:

namespace MyappTests;

我已经命名空间 RegistersUsers.php 像这样:

namespace MyappTests\Traits;

我的 UserTest 看起来像这样,带有命名空间和 use 声明,这样我就可以利用 RegistersUsers.

<?php

namespace MyappTests;

use MyappTests\Traits\RegistersUsers;

class UserTest extends TestCase
{
    use RegistersUsers;

    // ... rest of the class

然而,当我 运行 测试时,PHPUnit 因致命错误而死掉:

Trait 'MyappTests\Traits\RegistersUsers' not found in /home/vagrant/demo-app-net/tests/UserTest.php on line 9

据我所知,我的命名空间是正确的,应该可以找到我的特征。我一直在兜圈子,似乎无法弄清楚。

我猜 traits 文件夹中有 trait,但自动加载器中不再考虑该 trait。

为了更正这个问题,您应该打开 composer.json,找到 autoload-dev 的部分并将其更改为如下所示...

"autoload-dev": {
    "classmap": [
        "tests/TestCase.php",
        "tests/Traits/"
    ]
},

这应该会将该文件夹中的任何特征添加到自动加载器中。

编辑

评论中提出了一些额外的想法。如果您要维护适当的 folder/namespace 结构,最好使用 psr-4 自动加载而不是维护 class 映射。

"autoload-dev": {
    "psr-4": {
        "MyappTests\": "tests/"
    }
},

此外,当您扩展 TestCase 时,它不会将逻辑放入特性中以注册用户以用于测试,而是引入一个帮助方法来以特定用户身份登录。你会像这样使用它...

$user = User::find($id);
$this->be($user);

我正在开发 JSON REST API,在测试开发过程中,我发现需要重构我的一些测试功能以在测试中使用 class es.

重命名 class 后,PhpStorm 在日志中写道: Fatal error: Trait 'controllers\ControllerTestWithUsers2' not found in ... 当我尝试使用重命名的特征执行我的测试套件时。

我的问题的解决方案是简单地 运行 命令 composer dump-autoload 然后再次尝试 运行 我的测试套件。

我发现在PhpStorm中每次重命名都要进行这个操作。 composer 命令似乎重新生成了一些指向旧 class 名称的内部文件,导致“致命错误”。