私はGuzzleの非同期要求を使用しており、今すぐテストしたいサービスに実装しています。 、PhpUnitとProphecyで引数として呼び出し可能なメソッドをテストする方法
私の方法は、この(擬似、それは100%有効ではない場合は、お許し下さいので)
public function getPlayer(string $uiid, array &$player = [])
{
$options['query'] = ['id' => $uiid];
$promise = $this->requestAsync('GET', $this->endpoint, $options);
$promise->then(function (ResponseInterface $response) use (&$player) {
$player = $response->getBody()->getContents();
});
return $players;
}
のように見える今、私はそれをテストしたいが、私は実際に呼び出し可能に模擬する方法がわかりません私は常にエラー
1) tzfrs\PlayerBundle\Tests\Api\Player\PlayerServiceTest::testGetPlayer Prophecy\Exception\InvalidArgumentException: Expected callable or instance of PromiseInterface, but got object.
を取得していますので、これは、私はそれが現在
/** @var ObjectProphecy|PromiseInterface $response */
$promise = $this->prophesize(PromiseInterface::class);
$promise->then()->will($this->returnCallback(function (ResponseInterface $response) use (&$player){}));
01を実装している方法です
動作しませんでした。そして、この
$this->returnCallback(function (ResponseInterface $response) use (&$player){})
はどちらか動作しませんでした。同じエラー。単に
$promise->then(function(){});
ダミーのコールバックをしようとしたとき、私はさえ->reveal()
は最初の約束をINGの後、エラーError: Call to a member function then() on string
を取得します。何か案は?
これが見えますか?私はそれをやりたいと思っていません。私のプロジェクトを変えれば、テストはうまくいくでしょう。何とか呼び出し元を模倣する別の方法はありませんか? – Musterknabe
いいえ、そうではありません。それは、単一の責任であるソリッドの原理(それはラヴァレルの重要な原則の1つです)に従う新しいクラスを作ります。現在の実装では、1つのクラスで2つの関数を作成し、応答を送信して解析することを想定しています。 SOLIDを使用することのボーナスの1つとして、テスト可能なコードが得られます。 –
有効なポイント。しかし、Laravelを使用していませんが、Symfonyを使用しています。もう一つは、すでに私は読書とライティングを分けているということです。読み取りは別の場所で行われますが、実際にはstackoverflowの質問の機能は変更されないため、まとめておく必要があります。 しかし、あなたのように実装していて、呼び出し可能ではなく配列経由でメソッドを呼び出すと、テストにどのような影響がありますか?私はまだコールバックを渡さなければならない 'then'関数をモックする必要があります - 編集:私はaproxに行く必要があります。 1時間。あなたが答えたら、私は後で答えるでしょう – Musterknabe