的方法,以下是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 - 這個方法將被稱爲在每個迭代上
很難發現有什麼不好裏面去你的功能沒有看着他們。但是嘗試在xdebug中設置一個斷點,然後執行執行以找出錯誤。 XDebug是一個非常快速,功能強大且有用的工具,用於調試這些類型的錯誤。 –
感謝您的回覆。問題不在功能中,問題在於phpspec本身。該方法根本不會被調用。我可以使用xDebug遍歷phpspec的內部,但是誠實地說,我希望它不會來到這個 –