微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

覆盖请求和测试

如何解决覆盖请求和测试

我在从 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 classindex.PHP 将启动。


我在 Symfony 文档 中找到了以下信息,但我不知道这对我有什么帮助。 :)

要运行您的功能测试,WebTestCase class 需要知道 这是引导它的应用程序内核。内核类是 通常在 KERNEL_CLASS 环境变量中定义(包括 在 Symfony 提供的认 .env.test 文件中): 如果您的用例更复杂,您还可以覆盖 createKernel()getKernelClass() 函数方法 测试,它优先于 KERNEL_CLASS 环境变量。



以下是我在此主题上找到的一些有用链接
  • 测试和内核:点击here查看
  • 覆盖请求:点击here查看


编辑

这是我的测试/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.dist:

<?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 举报,一经查实,本站将立刻删除。