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

标签 php composer-php phpunit autoload

我正在编写一些单元测试来测试我的 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 死于 fatal error :

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/"
    ]
},

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

编辑

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

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

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

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

关于php - 在 Laravel 5 单元测试中找不到特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31253706/

相关文章:

php - 如何更改 Composer 创建供应商文件夹的位置

php - PSR 4 自动加载找不到类

phpunit - 如何在 PHPUnit 中捕捉 PHP 警告

PHPUnit:tearDown() 方法未处理的变量会怎样?

PHP - MySQLi INSERT 不工作

php - 在 ZipArchive 中设置权限

php - php-我应该在最终用户网站上使用的错误报告级别是完整的

php - 如果字段不存在则跳过表的 mysql 语句

php - 如何阅读或逆向工程 composer.lock 文件?

php - PHPUnit 测试的目录布局?