PHPUnit:“;类别';雄辩的';“未找到”;使用@dataProvider时

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: /应用/测试/ 示例模型: 我遇到了这个问题。

在Laravel应用程序中使用
@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'