2017-10-19 83 views
0

的方法,以下是phpspec代碼我有PHPSpec不會調用主題

function it_throws_if_raw_data_xml_is_invalid() 
{ 
    $website = $this->buildWebsite("some-deterministic-id", "some-deterministic-name"); 

    $this->convertAdwordsRawData($website, "yesterday", "invalidXML"); 

    $this->shouldThrow(AdwordsResponseNotParseable::class) 
     ->during("convertAdwordsRawData", [$website, "yesterday", "invalid-xml"]); 
} 

測試失敗,但不能因爲邏輯是錯誤的,但由於convertAdwordsRawData不會被調用。我在其中添加了var_dump,它不會顯示出來,而構造函數的輸出會通過。我試圖傳遞字符串而不是$網站,並得到了一個typehint問題。如果我只是在沒有斷言的情況下調用測試內部的方法,它就不會調用方法並通過測試,而不會從var_dump輸出任何內容。總而言之,phpspec不會爲我執行該方法。上面的一個測試,測試相同的公共方法,工作得很好。

這裏有什麼問題?

對於爭論起見,考慮方法執行以下操作

public function convertAdwordsRawData(Websites $website, string $time, string $rawData): \Generator 
    { 
     var_dump("Here I am"); 
     throw new AdwordsResponseNotParseable($rawData); 
     yield from [1,2,3,4,5]; 
    } 

更新 好了,這一切都歸結到PHP如何處理髮電機。該方法調用將返回一個尚未初始化的迭代器。當我在實際返回的生成器上調用該方法時,PHP將運行一切,直到第一次迭代中的第一次產出,並在任何連續迭代中返回產出。

從php.net網站

當一個發生器函數被調用的第一時間, 一個對象被返回內部生成類。該目的實現 Iterator接口

$this->convertAdwordsRawData(...)->shouldThrow(...)->duringCurrent();

是解決方案。電流()調用來自執行迭代器的PHP - 這個方法將被稱爲在每個迭代上

+0

很難發現有什麼不好裏面去你的功能沒有看着他們。但是嘗試在xdebug中設置一個斷點,然後執行執行以找出錯誤。 XDebug是一個非常快速,功能強大且有用的工具,用於調試這些類型的錯誤。 –

+0

感謝您的回覆。問題不在功能中,問題在於phpspec本身。該方法根本不會被調用。我可以使用xDebug遍歷phpspec的內部,但是誠實地說,我希望它不會來到這個 –

回答

0

試一下:

function it_throws_if_raw_data_xml_is_invalid(Websites $website) 
{ 
    $this->shouldThrow(AdwordsResponseNotParseable::class) 
    ->during("convertAdwordsRawData", [$website, "yesterday", "invalid-xml"]);  

} 

更多信息:http://www.phpspec.net/en/stable/cookbook/matchers.html#throw-matcher

+0

這正是我所擁有的。顯然問題是我對PHP如何處理迭代的低估,儘管初始化代碼(直到第一個yield)將被執行。但是PHP只在第一次迭代時才完成 –