2017-03-15 34 views
0

我是Codeception的新手,我正在研究使用它來運行我們的集成/驗收測試套件(目前有些phpunit腳本...)。這似乎是一個非常有趣的工具,但我遇到了一個問題,可能會阻止我們使用它。在Codeception中,是否可以在HTTP響應被解析之前攔截並修改它們?如果是這樣,怎麼樣?

我試圖找到一種方法來注入中間件或創建一個模塊,它將允許我從服務器的響應中剝離JSON protection string,然後由REST模塊對其進行解碼。

JSON的前綴爲")]}',\n",以使對象無效,從而防止某些瀏覽器中的某種類型的CSRF漏洞,但它破壞了json_decode()(有意)和Codeception REST驗證方法。

我正在尋找一種方法來修改響應,剝離前綴,在測試套件開始使用數據之前。有誰知道這是可能的嗎?或者如果有任何內置的方法來處理或重寫響應體?

不幸的是,從服務器輸出中刪除前綴不是一個選項。感謝您的任何建議!

+1

您可以創建一個幫手都將修改結果,並斷言它,看到這個鏈接獲取更多信息HTTP: //codeception.com/07-12-2012/assertions-in-helpers.html –

+0

這很有趣,但看起來這意味着我必須重新實現REST模塊中的每個與json相關的斷言,這可能不會太糟糕了,但我更喜歡 躲開它。我能夠擴展瀏覽器模塊,這看起來很有希望,但是有一個非常奇怪的繼承模型,使用反射並調用子類中的受保護方法導致訪問異常。 –

回答

0

您可以在REST模塊解析之前修改HTTP響應內容。

REST模塊使用PhpBrowser或某些Framefork模塊作爲HTTP客戶端。 因此,要刪除JSON保護字符串,您需要創建自己的模塊,該模塊將擴展PhpBrowser並覆蓋_getResponseContent()方法,然後在REST模塊配置中將此模塊用作依賴項。

假設我有REST方法http://example.dev/api/v1/test與保護前綴

)]}' 
{"test":"smest"} 

/tests/api.suite.yml

class_name: ApiTester 
modules: 
    enabled: 
     - REST: 
      depends: \Helper\MyPhpBrowser 
      url: 'http://example.dev/api/v1/'  
     - \Helper\Api 

/測試/ _support /助手返回以下JSON字符串/MyPhpBrowser.php

<?php 
namespace Helper; 

class MyPhpBrowser extends \Codeception\Module\PhpBrowser 
{ 
    public function _getResponseContent() 
    { 
     $rawContent = (string)$this->client->getInternalResponse()->getContent(); 

     // Here we're going to delete protection prefix from response content 
     $rawContent = preg_replace("/^\)\]\}'\n/", "", $rawContent); 

     return $rawContent; 
    } 
} 

/api/smestCept.php

<?php 
$I = new ApiTester($scenario); 

$I->sendGET('test'); 

$I->seeResponseContainsJson(['test' => 'smest']); 

結果

$ codecept run api smestCept.php 
Codeception PHP Testing Framework v2.2.4 
Powered by PHPUnit 4.8.27 by Sebastian Bergmann and contributors. 

Api Tests (1) ------------------------------------- 
✔ smestCept: (0.29s) 
--------------------------------------------------- 


Time: 579 ms, Memory: 12.50MB 

OK (1 test, 1 assertion) 
+0

謝謝發佈。這是答案,實際上幾乎就是我最終建立的解決方案(感謝Dominick的文章)。我在我的代碼中有一個無關的錯誤,我忽略了,因爲我認爲我錯了,謝謝你確認我是在正確的軌道上! –

相關問題