PHPUnit:“;类别';雄辩的';“未找到”;使用@dataProvider时
在Laravel应用程序中使用PHPUnit:“;类别';雄辩的';“未找到”;使用@dataProvider时,php,laravel,phpunit,composer-php,Php,Laravel,Phpunit,Composer Php,在Laravel应用程序中使用@dataProvider使用PHPUnit编写单元测试时,我遇到了一个问题。我收到的错误是: PHP致命错误:在第7行的/path/to/project/app/models/ExampleClass.PHP中找不到类'elount' 看起来数据提供程序中使用的常量导致了致命错误 composer.json: “psr-4”:{ “Acme\\Models\\”:“应用程序/模型” } phpunit.xml: /应用/测试/ 示例模型: 我遇到了这个问题。
@dataProvider
使用PHPUnit编写单元测试时,我遇到了一个问题。我收到的错误是:
PHP致命错误:在第7行的/path/to/project/app/models/ExampleClass.PHP中找不到类'elount'
看起来数据提供程序中使用的常量导致了致命错误
composer.json:
“psr-4”:{
“Acme\\Models\\”:“应用程序/模型”
}
phpunit.xml:
/应用/测试/
示例模型:
我遇到了这个问题。这与调用@dataProvider
方法时没有加载Laravel别名(例如Config::
,Log::
…)有关。这里有两种解决方案,我可以在这里想到
解决方案1
修改@dataProvider
,使其不使用模型类。在我的例子中,我在@dataProvider方法中创建模型对象,如下所示:
public function people() {
$person1 = new Person();
$person1->name = "me";
$person2 = new Person();
$person2->name = "you";
return [$person1, $person2];
}
由于@dataProvider
方法中引用了Person
类,因此它将尝试加载该类。然后它将失败,因为Laravel尚未创建有说服力的类别名
为了解决这个问题,我可以返回数据,并在测试本身中创建实际的模型对象:
public function people() {
return ["me", "you"];
}
public function testPerson($name) {
$person = new Person();
$person->name = $name;
// Assertions...
}
在您的情况下,这意味着返回[['true']]
,而不是[[ExampleClass::true]
解决方案2
我看不出有什么令人信服的理由在这里使用雄辩的
类别名。事实上,我根本不知道它为什么会存在(除了它“看起来”更好吗?)。我在IRC频道提到了这个,但没有得到回应。。。因此,如果有理由在这里使用别名,那么我不知道
也就是说,如果您的模型类扩展了底层的\illumb\Database\Eloquent\model
类而不是Eloquent
别名,那么您的测试将按原样开始工作
<?php
namespace Acme\Models;
use \Illuminate\Database\Eloquent\Model;
class ExampleClass extends Model
{
/**
* @var bool
*/
const TRUE = true;
}
您需要首先包括自动加载器
比如:
require __DIR__.'/../vendor/autoload.php';
PHPUnit不会为您加载自动加载器。您必须在数据提供程序中运行此功能。正如Thomas Kelley所说,这是因为如果您使用该特性或在setUp方法中自己创建应用程序,它会在运行CreateApplication代码之前获取dataProvider数据。这也会生成为x指定的数据提供程序无效。
PHPStorm只会说未执行测试代码>如果运行单个测试
public function fooDataProvider() {
$this->refreshApplication();
//Code using laravel
}
我也犯了同样的错误,那是因为
protected function setUp() : void {
}
在tests/TestCase.php中
我没有调用parent::setUp()
当我这样做时,错误消失了 尝试使用\雄辩代码>取而代之。有些PHP构建需要指向根命名空间。@Dencker,不,这没有帮助。编辑:删除也不使用雄辩
并使用class ExampleClass extends\elount
。我基本上实现了您的“解决方案1”,以便在发布问题之前绕过它,但我更喜欢“解决方案2”。解决方案2更好!谢谢这难道不是phpunit.xml
中的bootstrap=“bootstrap/autoload.php”
的功能吗?该文件不需要_DIR__.'/../vendor/autoload.php'代码>