我正在编写一些单元测试来测试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&#39; MyappTests \ Traits \ RegistersUsers&#39;在第9行的/home/vagrant/demo-app-net/tests/UserTest.php中找不到
据我所知,我的命名空间是正确的,应该找到我的特质。我一直在用这个圈子四处走动,似乎无法解决这个问题。
答案 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命令会重新生成一些指向旧类名称的内部文件,从而导致“致命错误”。