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

Posted

技术标签:

【中文标题】在 Laravel 5 单元测试中找不到特征【英文标题】:Trait not found inside Laravel 5 unit tests 【发布时间】:2015-09-24 01:31:48 【问题描述】:

我正在编写一些单元测试来测试我的 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 因致命错误而死:

在第 9 行的 /home/vagrant/demo-app-net/tests/UserTest.php 中找不到特征“MyappTests\Traits\RegistersUsers”

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

【问题讨论】:

【参考方案1】:

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

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

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

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

编辑

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

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

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

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

【讨论】:

这正是问题所在,我以为它会被自动拾取!谢谢! 或者使用 psr4,它会找到你的 Traits 命名空间。 以上更改应该有助于解决错误,但 IMO 更好的解决方案是使用 Codeception 来编写测试,而不是直接使用 PHPUnit - 它包含许多帮助方法,使测试 Laravel 应用程序变得非常容易。包括例如$I->amLoggedAs() 方法将验证您的用户。有关详细信息,请参阅codeception.com/docs/modules/Laravel5。【参考方案2】:

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

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

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

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

【讨论】:

以上是关于在 Laravel 5 单元测试中找不到特征的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript:仅在单元测试中找不到模块的声明文件

在单元测试用例的 TFS 构建中找不到路径的一部分

在单元测试中模拟时找不到 Laravel 外观类

在 laravel 5.2 单元测试中模拟作业

如何对我的 WCF 客户端类进行单元测试?

在laravel 5.1单元测试中嘲笑hasMany关系