後に対象のメソッドを呼び出すことはありませんが、ロジックが間違っているので、しかし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の実装から来ている - このメソッドは、すべての反復
をそれは間違った内部何が起こっているかを見分けるのは難しいですあなたの機能を見ずに。しかし、xdebugにブレークポイントを設定してから、何がうまくいかないかを調べるために実行をステップしてください。 XDebugは、これらの種類のバグをデバッグするための、本当に迅速で強力で便利なツールです。 –
お返事ありがとうございます。問題は関数ではなく、問題はphpspec自体にあります。このメソッドはまったく呼び出されません。私はxDebugを使ってphpspecの内部をたどることができましたが、正直に言えば、これは来ないと思っていました –