如何在 Symfony2 Listener UnitTest 中伪造 HTTP_USER_AGENT?
How to fake the HTTP_USER_AGENT in a Symfony2 Listener UnitTest?
我有一个监听器,它的行为因 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 告诉我,我的用户代理仍然是空的,我的案例没有被覆盖。
知道如何为这种情况设置用户代理吗?
如果您将实际检查提取到 class 中其他地方的函数,则可以在 class 中模拟或以其他方式覆盖该检查,并将其保留为单元测试,而不是根本不需要伪造 HTTP 请求。
对于完整的集成测试,如果您将实际检查提取到单独的服务,那么您可以使用 config_test.yml 文件中的不同配置覆盖检查,并使用该服务的不同副本在测试环境中总是报告错误。
# 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
我有一个监听器,它的行为因 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 告诉我,我的用户代理仍然是空的,我的案例没有被覆盖。
知道如何为这种情况设置用户代理吗?
如果您将实际检查提取到 class 中其他地方的函数,则可以在 class 中模拟或以其他方式覆盖该检查,并将其保留为单元测试,而不是根本不需要伪造 HTTP 请求。
对于完整的集成测试,如果您将实际检查提取到单独的服务,那么您可以使用 config_test.yml 文件中的不同配置覆盖检查,并使用该服务的不同副本在测试环境中总是报告错误。
# 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