gpt4 book ai didi

PHPUnit: "Class ' Eloquent' not found"when using @dataProvider

转载 作者:可可西里 更新时间:2023-11-01 13:24:13 27 4
gpt4 key购买 nike

在 Laravel 应用程序中使用 @dataProvider 使用 PHPUnit 编写单元测试时,我遇到了问题。我收到的错误是:

PHP Fatal error: Class 'Eloquent' not found in /path/to/project/app/models/ExampleClass.php on line 7

看起来 dataProvider 中使用的常量导致了 fatal error 。

Composer .json:

"psr-4": {
"Acme\\Models\\": "app/models"
}

phpunit.xml:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
>
<testsuites>
<testsuite name="Application Test Suite">
<directory>./app/tests/</directory>
</testsuite>
</testsuites>
</phpunit>

示例模型:

<?php
namespace Acme\Models;

use Eloquent;

class ExampleClass extends Eloquent
{
/**
* @var bool
*/
const TRUE = true;
}

示例测试类:

<?php

use Acme\Models\ExampleClass;

class ExampleClassTest extends TestCase
{
/**
* Example test.
*
* @param int $value
* @return void
* @dataProvider testExampleTestDataProvider
*/
public function testExampleTest($value)
{
$this->assertTrue($value);
}

/**
* Data provider for testExampleTest.
*
* @return array
*/
public function testExampleTestDataProvider()
{
return array(
array(ExampleClass::TRUE),
);
}
}

堆栈跟踪:

PHP Stack trace:
PHP 1. {main}() /usr/local/bin/phpunit:0
PHP 2. PHPUnit_TextUI_Command::main() /usr/local/bin/phpunit:612
PHP 3. PHPUnit_TextUI_Command->run() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:138
PHP 4. PHPUnit_TextUI_Command->handleArguments() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:148
PHP 5. PHPUnit_Util_Configuration->getTestSuiteConfiguration() phar:///usr/local/bin/phpunit/phpunit/TextUI/Command.php:696
PHP 6. PHPUnit_Util_Configuration->getTestSuite() phar:///usr/local/bin/phpunit/phpunit/Util/Configuration.php:837
PHP 7. PHPUnit_Framework_TestSuite->addTestFiles() phar:///usr/local/bin/phpunit/phpunit/Util/Configuration.php:924
PHP 8. PHPUnit_Framework_TestSuite->addTestFile() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:400
PHP 9. PHPUnit_Framework_TestSuite->addTestSuite() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:374
PHP 10. PHPUnit_Framework_TestSuite->__construct() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:289
PHP 11. PHPUnit_Framework_TestSuite->addTestMethod() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:188
PHP 12. PHPUnit_Framework_TestSuite::createTest() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:842
PHP 13. PHPUnit_Util_Test::getProvidedData() /path/to/project/vendor/phpunit/phpunit/src/Framework/TestSuite.php:465
PHP 14. ReflectionMethod->invoke() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:392
PHP 15. ExampleClassTest->testExampleTestDataProvider() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:392
PHP 16. spl_autoload_call() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:27
PHP 17. Composer\Autoload\ClassLoader->loadClass() /path/to/project/vendor/phpunit/phpunit/src/Util/Test.php:0
PHP 18. Composer\Autoload\includeFile() /path/to/project/vendor/composer/ClassLoader.php:278
PHP 19. include() /path/to/project/vendor/composer/ClassLoader.php:386

最佳答案

我遇到了这个确切的问题。它与 Laravel 别名(例如 Config::Log::...)在 时尚未加载的事实有关@dataProvider 方法被调用。我在这里可以想到两种解决方案。

解决方案一

修改您的@dataProvider,使其不使用模型类。就我而言,我在 @dataProvider 方法中创建模型对象,如下所示:

public function people() {
$person1 = new Person();
$person1->name = "me";

$person2 = new Person();
$person2->name = "you";

return [$person1, $person2];
}

由于 Person 类在 @dataProvider 方法中被引用,它将尝试加载该类。然后它将失败,因为 Laravel 尚未创建 Eloquent 类别名。

为了解决这个问题,我可以只返回数据,并在测试本身中创建实际的模型对象:

public function people() {
return ["me", "you"];
}

public function testPerson($name) {
$person = new Person();
$person->name = $name;

// Assertions...
}

在您的情况下,这意味着返回 [['true']],而不是 [[ExampleClass::TRUE]]

方案二

我看不到在这里使用 Eloquent 类别名的令人信服的理由。事实上,我根本不知道它为什么存在(也许除了它“看起来”更好?)。我在 IRC channel 中提出了这个问题,但没有得到回应...所以如果有理由在这里使用别名,那么我不知道。

也就是说,如果你的模型类扩展了底层的 \Illuminate\Database\Eloquent\Model 类而不是 Eloquent 别名,那么你的测试将开始工作——是。

<?php
namespace Acme\Models;

use \Illuminate\Database\Eloquent\Model;

class ExampleClass extends Model
{
/**
* @var bool
*/
const TRUE = true;
}

关于PHPUnit: "Class ' Eloquent' not found"when using @dataProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217936/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com