如何解决覆盖请求和测试
我在从 Symfony 扩展默认请求类和编写单元测试时遇到问题。
我在 index.PHP
中设置了一个请求工厂,然后在 RequestListener 中为自定义请求设置了一些属性,它工作正常,但是当我运行测试类时,它中断了。
这里是 index.PHP:
<?PHP
use App\Kernel;
use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\ErrorHandler\Debug;
use Symfony\Component\HttpFoundation\Request;
require dirname(__DIR__).'/vendor/autoload.PHP';
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
if ($_SERVER['APP_DEBUG']) {
umask(0000);
Debug::enable();
}
$kernel = new Kernel($_SERVER['APP_ENV'],(bool) $_SERVER['APP_DEBUG']);
Request::setFactory(function (array $query = [],array $request = [],array $attributes = [],array $cookies = [],array $files = [],array $server = [],$content = null) {
return new \App\Extension\HttpFoundationExtension\Request($query,$request,$attributes,$cookies,$files,$server,$content);
});
$request = Request::createFromGlobals();
$response = $kernel->handle($request);
$response->send();
$kernel->terminate($request,$response);
这里也是测试类:
<?PHP
namespace App\Tests\Api;
use ApiPlatform\Core\Bridge\Symfony\Bundle\Test\ApiTestCase;
class AccountTest extends ApiTestCase
{
public function testGetCollection(): void
{
$response = static::createClient()->request("GET","/accounts");
self::assertResponseStatusCodeSame(201);
}
}
我不知道为什么,但如果我扩展 WebTestCase 而不是测试中的 ApiTestCase class
,index.PHP
将启动。
我在 Symfony 文档 中找到了以下信息,但我不知道这对我有什么帮助。 :)
要运行您的功能测试,WebTestCase class
需要知道
这是引导它的应用程序内核。内核类是
通常在 KERNEL_CLASS
环境变量中定义(包括
在 Symfony 提供的默认 .env.test 文件中):
如果您的用例更复杂,您还可以覆盖
createKernel()
或 getKernelClass()
函数的方法
测试,它优先于 KERNEL_CLASS
环境变量。
以下是我在此主题上找到的一些有用链接:
编辑:
这是我的测试/bootstrap.PHP:
<?PHP
use Symfony\Component\Dotenv\Dotenv;
require dirname(__DIR__).'/vendor/autoload.PHP';
if (file_exists(dirname(__DIR__).'/config/bootstrap.PHP')) {
require dirname(__DIR__).'/config/bootstrap.PHP';
} elseif (method_exists(Dotenv::class,'bootEnv')) {
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://PHPunit.readthedocs.io/en/latest/configuration.html -->
<PHPunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="bin/.PHPunit/PHPunit.xsd"
backupGlobals="false"
colors="true"
bootstrap="tests/bootstrap.PHP"
>
<PHP>
<ini name="error_reporting" value="-1" />
<server name="APP_ENV" value="test" force="true" />
<server name="SHELL_VERBOSITY" value="-1" />
<server name="SYMFONY_PHPUNIT_REMOVE" value="" />
<server name="SYMFONY_PHPUNIT_VERSION" value="8.5" />
</PHP>
<testsuites>
<testsuite name="Project Test Suite">
<directory>tests</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".PHP">src</directory>
</whitelist>
</filter>
<listeners>
<listener class="Symfony\Bridge\PHPUnit\SymfonyTestsListener" />
</listeners>
<!-- Run `composer require symfony/panther` before enabling this extension -->
<!--
<extensions>
<extension class="Symfony\Component\Panther\ServerExtension" />
</extensions>
-->
</PHPunit>
这是 .env.test 的一部分:
KERNEL_CLASS='App\Kernel'
使用此配置后,我仍然遇到同样的问题!
谢谢!
解决方法
检查您的 .env.test
文件并搜索 KERNEL_CLASS
声明。如果不存在,请添加它(例如:KERNEL_CLASS='App\Kernel'
)。
.env.test:
KERNEL_CLASS='App\Kernel'
然后检查引导测试文件是否正在使用 Dotenv 组件加载 .env 文件(并检查是否安装了 dotenv 组件)。此文件通常位于 tests/bootstrap.php
。
<?php
use Symfony\Component\Dotenv\Dotenv;
require \dirname(__DIR__).'/vendor/autoload.php';
if (\file_exists(\dirname(__DIR__).'/config/bootstrap.php')) {
require \dirname(__DIR__).'/config/bootstrap.php';
} elseif (\method_exists(Dotenv::class,'bootEnv')) {
(new Dotenv())->bootEnv(\dirname(__DIR__).'/.env');
}
通过根 phpunit.xml
标记的 phpunit.xml.dist
属性验证 bootstrap
(或 phpunit
)是否需要它。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit ... bootstrap="tests/bootstrap.php">
...
</phpunit>
你的错误现在应该消失了。
我不认为请求覆盖在您的错误中起作用。无论如何,代码中记录了设置请求工厂仅留给 BC。您只需从您的扩展 Request 类中调用 createFromGlobals
即可获得完全相同的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。