2017-05-05 60 views
0

我有一個監聽器,它的行爲不同,具體取決於HTTP_USER_AGENT:如何僞裝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告訴我,我的用戶代理仍然是零,而不是覆蓋我的情況。
任何想法如何爲這種情況下設置用戶代理?

回答

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

啊確定你提出我寫了一種userAgentCheckerHelper的這如果需要,我可以再嘲笑? –

+0

類中的函數或包裝函數的服務,是的。 –

+0

如何嘲笑$ request-> server-> get? 我認爲,但由於沒有像getServer方法模擬我卡在那裏。 你有什麼想法做到這一點? –