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

2022-08-30 19:47:04

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

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

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

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

namespace MyappTests;

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

namespace MyappTests\Traits;

我看起来像这样,带有命名空间和声明,以便我可以利用.UserTestuseRegistersUsers

<?php

namespace MyappTests;

use MyappTests\Traits\RegistersUsers;

class UserTest extends TestCase
{
    use RegistersUsers;

    // ... rest of the class

但是,当我运行测试时,PHPUnit会死机并出现致命错误:

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

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


答案 1

我猜想在traits文件夹中有这个特征,这个特征不再在你的自动加载器中被考虑在内。

为了纠正这一点,您应该打开,找到该部分并将其更改为如下所示的内容...composer.jsonautoload-dev

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

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

编辑

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

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

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

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

答案 2

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

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

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

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


推荐