gpt4 book ai didi

php - Laravel 框架类在 PHPUnit 数据提供程序中不可用

转载 作者:行者123 更新时间:2023-12-01 23:54:18 24 4
gpt4 key购买 nike

我在 Laravel 中进行了如下设置:

/app/controllers/MyController.php中:

class MyController extends BaseController {

const MAX_FILE_SIZE = 10000;

// ....

}

/app/tests/MyControllerTest.php中:

class MyControllerTest extends TestCase {

public function myDataProvider() {
return [
[ MyController::MAX_FILE_SIZE ]
];
}

/**
* @dataProvider myDataProvider
*/
public function testMyController($a) {
// Just an example
$this->assertTrue(1 == 1);
}
}

但是,当我运行 vendor/bin/phpunit 时,出现以下错误:

PHP Fatal error:  Class 'Controller' not found in /home/me/my-app/app/controllers/BaseController.php on line 3Fatal error: Class 'Controller' not found in /home/me/my-app/app/controllers/BaseController.php on line 3

如果我在 myDataProvider() 中删除对 MyController 类的引用并将其替换为文字常量,则测试成功完成。

此外,我可以在实际的 testMyController() 方法中放置对 MyController::MAX_FILE_SIZE 的引用,测试也会成功完成。

看起来 Laravel 框架类的自动加载设置直到调用数据提供者方法之后才被设置,但是之前实际的测试方法是叫。 有什么办法可以解决这个问题,以便我可以从 PHPUnit 数据提供程序中访问 Laravel 框架类吗?

<小时/>

注意:我直接从命令行调用 PHPUnit,而不是从 IDE(例如 NetBeans)中调用。我知道有些人对此有疑问,但我认为这不适用于我的问题。

最佳答案

正如 this answer 中所暗示的那样,这似乎与 PHPUnit 在任何测试用例中调用任何数据提供程序和 setUp() 方法的顺序有关。

PHPUnit 将在运行任何测试之前调用数据提供程序方法。在每次测试之前,它还会调用测试用例中的 setUp() 方法。 Laravel Hook 到 setUp() 方法来调用 $this->createApplication() ,这会将 Controller 类添加到“包含路径”中,以便它们可以正确自动加载.

由于数据提供程序方法在此发生之前运行,因此对数据提供程序内的 Controller 类的任何引用都会失败。可以通过将测试类修改为如下内容来解决此问题:

class MyControllerTest extends TestCase {

public function __construct($name = null, array $data = array(), $dataName = '') {
parent::__construct($name, $data, $dataName);

$this->createApplication();
}

public function myDataProvider() {
return [
[ MyController::MAX_FILE_SIZE ]
];
}

/**
* @dataProvider myDataProvider
*/
public function testMyController($a) {
// Just an example
$this->assertTrue(1 == 1);
}
}

这将在数据提供程序方法运行之前调用 createApplication(),因此存在一个有效的应用程序实例,允许正确自动加载相应的类。

这似乎有效,但我不确定这是否是最佳解决方案,或者是否可能导致任何问题(尽管我想不出任何原因)。

关于php - Laravel 框架类在 PHPUnit 数据提供程序中不可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26710631/

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