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

Php 在Laravel 5单元测试中未找到特征,php,composer-php,phpunit,autoload,Php,Composer Php,Phpunit,Autoload,我正在编写一些单元测试来测试我的Laravel 5应用程序中的API端点,许多端点需要用户身份验证。与在每个测试中使用相同的用户帐户创建代码不同,我想定义一个用于测试类的RegisterUserstrait,它将有一个registerUser()方法 mytests目录的目录结构如下: /tests /Traits RegistersUsers.php TestCase.php UserTest.php 通过添加以下名称空间声明,我已命名了TestCas

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

my
tests
目录的目录结构如下:

/tests
    /Traits
        RegistersUsers.php
    TestCase.php
    UserTest.php
通过添加以下名称空间声明,我已命名了
TestCase.php
UserTest.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

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

为了纠正这个问题,您应该打开
composer.json
,找到
autoloaddev
的部分,并将其更改为如下内容

"autoload-dev": {
    "classmap": [
        "tests/TestCase.php",
        "tests/Traits/"
    ]
},
这将把你在该文件夹中的所有特征添加到autloader中

编辑

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

"autoload-dev": {
    "psr-4": {
        "MyappTests\\": "tests/"
    }
},
此外,当您扩展
TestCase
时,它引入了一个帮助器方法,用于作为特定用户登录,而不是将逻辑放在trait中注册用户以用于测试。你会像这样使用它

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

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

重命名类后,PhpStorm在日志中写入如下内容:
致命错误:在…中找不到Trait'controllers\ControllerTestWithUsers2'。
当我试图使用重命名的trait执行我的测试套件时

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

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

这正是问题所在,我认为它会被自动拾取!非常感谢。或者使用psr4,它可以找到你的Traits名称空间。上面的更改应该有助于解决错误,但我认为更好的解决方案是使用Codeception来编写测试,而不是直接使用PHPUnit——它包含许多帮助方法,使测试Laravel应用程序变得非常简单。包括将对用户进行身份验证的$I->amLoggedAs()方法。有关更多详细信息,请参阅。