Laravel 5单元测试中未发现特征

Joh*_*ean 15 php phpunit traits laravel laravel-5

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

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

/tests
    /Traits
        RegistersUsers.php
    TestCase.php
    UserTest.php
Run Code Online (Sandbox Code Playgroud)

我已命名TestCase.phpUserTest.php添加此命名空间声明:

namespace MyappTests;
Run Code Online (Sandbox Code Playgroud)

而且我RegistersUsers.php像这样命名:

namespace MyappTests\Traits;
Run Code Online (Sandbox Code Playgroud)

UserTest看起来像这样,使用命名空间和use声明,以便我可以利用RegistersUsers.

<?php

namespace MyappTests;

use MyappTests\Traits\RegistersUsers;

class UserTest extends TestCase
{
    use RegistersUsers;

    // ... rest of the class
Run Code Online (Sandbox Code Playgroud)

但是,当我运行测试时,PHPUnit死于致命错误:

在第9行/home/vagrant/demo-app-net/tests/UserTest.php中找不到Trait'MyappTests\Traits\RegistersUsers'

据我所知,我的命名空间是正确的,应该找到我的特点.我一直在与这个圈子四处走动,似乎无法弄明白.

use*_*496 21

我猜测在traits文件夹中有这个特性,你的自动加载器中不再考虑这个特性.

为了纠正这个问题,你应该打开composer.json,查找部分autoload-dev并将其更改为以下内容...

"autoload-dev": {
    "classmap": [
        "tests/TestCase.php",
        "tests/Traits/"
    ]
},
Run Code Online (Sandbox Code Playgroud)

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

编辑

评论中提出了一些其他想法.如果您要维护正确的文件夹/命名空间结构,那么使用psr-4自动加载而不是维护类映射是个好主意.

"autoload-dev": {
    "psr-4": {
        "MyappTests\\": "tests/"
    }
},
Run Code Online (Sandbox Code Playgroud)

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

$user = User::find($id);
$this->be($user);
Run Code Online (Sandbox Code Playgroud)

  • 或者使用 psr4,它会找到您的 Traits 命名空间。 (2认同)

小智 13

我正在开发一个 JSON REST API,在测试开发期间,我发现需要在要在测试类中使用的 trait 中重构我的一些测试功能。

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

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

我发现每次在 PhpStorm 中执行重命名时都必须执行此操作。似乎 composer 命令重新生成了一些指向旧类名的内部文件,导致了“致命错误”。