如何在Symfony2 Listener UnitTest中伪造HTTP_USER_AGENT?

时间:2017-05-05 14:57:54

标签: php phpunit symfony-2.8

我有一个监听器,它的行为有所不同,具体取决于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告诉我,我的用户代理仍为空,我的案例没有被覆盖。
知道如何为这种情况设置用户代理吗?

1 个答案:

答案 0 :(得分:1)

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

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

<Setter Property="Background" Value="{Binding Access_Notes

在主文件中它将是

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