Php 在Laravel 5单元测试中未找到特征
我正在编写一些单元测试来测试我的Laravel 5应用程序中的API端点,许多端点需要用户身份验证。与在每个测试中使用相同的用户帐户创建代码不同,我想定义一个用于测试类的Php 在Laravel 5单元测试中未找到特征,php,composer-php,phpunit,autoload,Php,Composer Php,Phpunit,Autoload,我正在编写一些单元测试来测试我的Laravel 5应用程序中的API端点,许多端点需要用户身份验证。与在每个测试中使用相同的用户帐户创建代码不同,我想定义一个用于测试类的RegisterUserstrait,它将有一个registerUser()方法 mytests目录的目录结构如下: /tests /Traits RegistersUsers.php TestCase.php UserTest.php 通过添加以下名称空间声明,我已命名了TestCas
RegisterUsers
trait,它将有一个registerUser()
方法
mytests
目录的目录结构如下:
/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
我猜这个特征在traits文件夹中,这个特征在你的自动加载器中不再被考虑
为了纠正这个问题,您应该打开composer.json
,找到autoloaddev
的部分,并将其更改为如下内容
"autoload-dev": {
"classmap": [
"tests/TestCase.php",
"tests/Traits/"
]
},
这将把你在该文件夹中的所有特征添加到autloader中
编辑
评论中提出了一些补充意见。如果要维护正确的文件夹/命名空间结构,最好使用psr-4自动加载,而不是维护类映射
"autoload-dev": {
"psr-4": {
"MyappTests\\": "tests/"
}
},
此外,当您扩展TestCase
时,它引入了一个帮助器方法,用于作为特定用户登录,而不是将逻辑放在trait中注册用户以用于测试。你会像这样使用它
$user = User::find($id);
$this->be($user);
我正在开发一个JSON REST API,在测试开发期间,我发现需要在测试类中使用的trait中重构我的一些测试功能
重命名类后,PhpStorm在日志中写入如下内容:
致命错误:在…中找不到Trait'controllers\ControllerTestWithUsers2'。
当我试图使用重命名的trait执行我的测试套件时
我的问题的解决方案是简单地运行命令composer dump autoload
,然后再次尝试运行我的测试套件
我发现每次在PhpStorm中执行重命名时都必须执行此操作。
似乎composer命令重新生成了一些指向旧类名的内部文件,导致了“致命错误”。这正是问题所在,我认为它会被自动拾取!非常感谢。或者使用psr4,它可以找到你的Traits名称空间。上面的更改应该有助于解决错误,但我认为更好的解决方案是使用Codeception来编写测试,而不是直接使用PHPUnit——它包含许多帮助方法,使测试Laravel应用程序变得非常简单。包括将对用户进行身份验证的$I->amLoggedAs()方法。有关更多详细信息,请参阅。