如何在 Symfony2 Listener UnitTest 中伪造 HTTP_USER_AGENT?

问题描述 投票:0回答:2

我有一个监听器,它的行为因 HTTP_USER_AGENT 而异:

        if ($request->server->get('HTTP_USER_AGENT') == $this->zabbixUserAgent) {
            VisitorHolder::set($visitor);
        } else {
            VisitorHolder::set($this->visitorService->persist($visitor));
        }

我想避免将所有 Zabbix 请求保存到我们的数据库中。这工作得很好,但是我如何在单元测试中伪造用户代理,以便我的测试涵盖这种情况?

创建一个新的请求并在那里设置用户代理被完全忽略:

    $this->currentRequest = new Request(
        [], // GET parameters
        [], // POST parameters
        [], // request attributes (parameters parsed from the PATH_INFO, ...)
        [], // COOKIE parameters
        [], // FILES parameters
        ['HTTP_USER_AGENT' => 'zbx'], // SERVER parameters
        null // raw body data
    );

    $this->requestStack
        ->expects($this->any())
        ->method('getCurrentRequest')
        ->willReturn($this->currentRequest);

单元测试中的 var_dump 告诉我,我的用户代理仍然为空,并且我的情况没有被覆盖。
知道如何为这种情况设置用户代理吗?

php phpunit symfony-2.8
2个回答
1
投票

如果您将实际检查提取到类中其他位置的函数,则可以在类中模拟或以其他方式覆盖该检查,并将其保留为根本不需要伪造 HTTP 请求的单元测试。

对于完整的集成测试,如果您将实际检查提取到单独的服务,那么您可以使用 config_test.yml 文件中的差异配置覆盖该检查,并使用在测试中始终报告 false 的服务的不同副本-环境。

# config_test.yml file:
app_zabbix_detect.detector:
    class: AppBundle\Services\ZabbixDetectorAlwaysFalse

在主文件中它将是

# config.yml file: (or services.yml)
app_zabbix_detect.detector:
    class: AppBundle\Services\ZabbixDetector # real test

0
投票

我正在使用 Symfony v6.4

测试中:

$client = static::createClient(array(), array(
        'HTTP_HOST' => 'mySymfonyApp', // Set HOST HTTP Header.
        'HTTP_USER_AGENT' => 'Symfony Browser/1.0', // Set Agent header.
));

以下代码在控制器中运行:

$param->setCreatedUserAgent($request->server->get('HTTP_USER_AGENT'));

如果这是在生产环境中,您将获得浏览器(用户代理)详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.