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

时间:2015-07-06 19:08:20

标签: php laravel phpunit laravel-5 traits

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

  

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

据我所知,我的命名空间是正确的,应该找到我的特质。我一直在用这个圈子四处走动,似乎无法解决这个问题。

2 个答案:

答案 0 :(得分:20)

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

要解决此问题,您应该打开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);

答案 1 :(得分:11)

我正在开发JSON REST API,在测试开发过程中,我发现有必要在特征中重构我的一些测试功能,以供在测试类中使用。

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

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

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