2017-10-19 1 views
0

後に対象のメソッドを呼び出すことはありませんが、ロジックが間違っているので、しかしconvertAdwordsRawDataが呼び出されることは決してありませんので、私はテストが失敗した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"]); 
} 

を持っていますが、ないPHPSpecのコードです。私はそれにvar_dumpを追加しても、コンストラクタからの出力が通過する間は表示されません。私は$ウェブサイトの代わりに文字列を渡そうとしましたが、タイプヒントの問題がありました。アサーションなしでテスト内でメソッドを呼び出すだけでは、メソッドを呼び出すことはなく、var_dumpから何も出力せずにテストに合格します。要約すると、phpspecは私のためにメソッドを実行しません。同じパブリックメソッドをテストする1つ上のテストはうまく動作します。

ここで間違っていますか?それはすべてのPHPは発電機をどのように扱うかに降りてくるように、引数の便宜上

、方法を検討するには、 オーケー

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は最初のイテレーションで最初のyieldまですべてを実行し、連続する繰り返しでyieldを返します。 php.netのウェブサイトジェネレータ関数が初めて呼び出され

、内部Generatorクラスが返され の対象から

。このオブジェクトは イテレータインターフェース

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

が溶液で実現します。現在の()の呼び出しは、PHPでのIteratorの実装から来ている - このメソッドは、すべての反復

+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は最初の繰り返しでのみそれを行います –

関連する問題