在 Laravel 5 单元测试中找不到特征
Posted
技术标签:
【中文标题】在 Laravel 5 单元测试中找不到特征【英文标题】:Trait not found inside Laravel 5 unit tests 【发布时间】:2015-09-24 01:31:48 【问题描述】:我正在编写一些单元测试来测试我的 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 因致命错误而死:
在第 9 行的 /home/vagrant/demo-app-net/tests/UserTest.php 中找不到特征“MyappTests\Traits\RegistersUsers”
据我所知,我的命名空间是正确的,应该可以找到我的特征。我一直在绕圈子,似乎无法弄清楚。
【问题讨论】:
【参考方案1】:我猜在 traits 文件夹中有 trait,你的自动加载器中不再考虑 trait。
为了纠正这个问题,你应该打开composer.json
,找到autoload-dev
的部分并将其更改为类似以下的内容...
"autoload-dev":
"classmap": [
"tests/TestCase.php",
"tests/Traits/"
]
,
这应该将您在该文件夹中的所有特征添加到自动加载器。
编辑
在 cmets 中提出了一些额外的想法。如果您要维护正确的文件夹/命名空间结构,最好使用 psr-4 自动加载而不是维护类映射。
"autoload-dev":
"psr-4":
"MyappTests\\": "tests/"
,
此外,当您扩展TestCase
时,它不会将逻辑放入特征中以注册用户以供测试使用,它会引入一个帮助方法来以特定用户身份登录。你会这样使用它...
$user = User::find($id);
$this->be($user);
【讨论】:
这正是问题所在,我以为它会被自动拾取!谢谢! 或者使用 psr4,它会找到你的 Traits 命名空间。 以上更改应该有助于解决错误,但 IMO 更好的解决方案是使用 Codeception 来编写测试,而不是直接使用 PHPUnit - 它包含许多帮助方法,使测试 Laravel 应用程序变得非常容易。包括例如$I->amLoggedAs() 方法将验证您的用户。有关详细信息,请参阅codeception.com/docs/modules/Laravel5。【参考方案2】:我正在开发一个 JSON REST API,在测试开发过程中,我发现需要在一个 trait 中重构我的一些测试功能,以便在测试类中使用。
重命名一个类后,PhpStorm 在日志中写道:
Fatal error: Trait 'controllers\ControllerTestWithUsers2' not found in ...
当我尝试使用重命名的特征执行我的测试套件时。
我的问题的解决方案是简单地运行命令composer dump-autoload
,然后再次尝试运行我的测试套件。
我发现每次在 PhpStorm 中执行重命名时都必须执行此操作。 似乎composer命令重新生成了一些指向旧类名的内部文件,导致“致命错误”。
【讨论】:
以上是关于在 Laravel 5 单元测试中找不到特征的主要内容,如果未能解决你的问题,请参考以下文章