Laravel 5 单元测试中未找到特征
Trait not found inside Laravel 5 unit tests
我正在编写一些单元测试来测试我的 Laravel 5 应用程序中的 API 端点,许多端点需要用户身份验证。我不想在每个测试中都使用相同的用户帐户创建代码,而是想定义一个 RegistersUsers
特征以用于测试 类,它将有一个 registerUser()
方法。
我的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
然而,当我 运行 测试时,PHPUnit 因致命错误而死掉:
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/"
]
},
这应该会将该文件夹中的任何特征添加到自动加载器中。
编辑
评论中提出了一些额外的想法。如果您要维护适当的 folder/namespace 结构,最好使用 psr-4 自动加载而不是维护 class 映射。
"autoload-dev": {
"psr-4": {
"MyappTests\": "tests/"
}
},
此外,当您扩展 TestCase
时,它不会将逻辑放入特性中以注册用户以用于测试,而是引入一个帮助方法来以特定用户身份登录。你会像这样使用它...
$user = User::find($id);
$this->be($user);
我正在开发 JSON REST API,在测试开发过程中,我发现需要重构我的一些测试功能以在测试中使用 class es.
重命名 class 后,PhpStorm 在日志中写道:
Fatal error: Trait 'controllers\ControllerTestWithUsers2' not found in ...
当我尝试使用重命名的特征执行我的测试套件时。
我的问题的解决方案是简单地 运行 命令 composer dump-autoload
然后再次尝试 运行 我的测试套件。
我发现在PhpStorm中每次重命名都要进行这个操作。
composer 命令似乎重新生成了一些指向旧 class 名称的内部文件,导致“致命错误”。
我正在编写一些单元测试来测试我的 Laravel 5 应用程序中的 API 端点,许多端点需要用户身份验证。我不想在每个测试中都使用相同的用户帐户创建代码,而是想定义一个 RegistersUsers
特征以用于测试 类,它将有一个 registerUser()
方法。
我的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
然而,当我 运行 测试时,PHPUnit 因致命错误而死掉:
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/"
]
},
这应该会将该文件夹中的任何特征添加到自动加载器中。
编辑
评论中提出了一些额外的想法。如果您要维护适当的 folder/namespace 结构,最好使用 psr-4 自动加载而不是维护 class 映射。
"autoload-dev": {
"psr-4": {
"MyappTests\": "tests/"
}
},
此外,当您扩展 TestCase
时,它不会将逻辑放入特性中以注册用户以用于测试,而是引入一个帮助方法来以特定用户身份登录。你会像这样使用它...
$user = User::find($id);
$this->be($user);
我正在开发 JSON REST API,在测试开发过程中,我发现需要重构我的一些测试功能以在测试中使用 class es.
重命名 class 后,PhpStorm 在日志中写道:
Fatal error: Trait 'controllers\ControllerTestWithUsers2' not found in ...
当我尝试使用重命名的特征执行我的测试套件时。
我的问题的解决方案是简单地 运行 命令 composer dump-autoload
然后再次尝试 运行 我的测试套件。
我发现在PhpStorm中每次重命名都要进行这个操作。 composer 命令似乎重新生成了一些指向旧 class 名称的内部文件,导致“致命错误”。