我正在使用Guzzle的异步请求,并在我现在想要测试的服务中实现它们。
我的方法看起来像这样(伪的,所以如果它不是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;
}现在我想测试它,但我真的不知道如何模拟callable,因为我总是收到错误
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){}));没有起作用。还有这个
$this->returnCallback(function (ResponseInterface $response) use (&$player){})
也不管用。同样的错误。当简单地尝试一个虚拟回调时
$promise->then(function(){});
即使在先->reveal()了promise之后,我也得到了错误Error: Call to a member function then() on string。有什么想法吗?
发布于 2016-09-16 20:42:13
我有了另一个想法。
创建一个将在requestAsync()中生成的依赖项;然后创建它的mock,它将返回另一个mock of promise。
class PromiseMock
{
private $response;
public function __construct(ResponseInterface $response)
{
$this->response = $response;
}
public function then($callable)
{
$callable($this->response);
}
}测试看起来像这样
public function testGetPlayer()
{
$response = new Response(200, [], "Your test response");
$promiseMock = new PromiseMock($response);
$mockDependency = $this->getMockBuilder('YourDependencyClass')
->getMock()
->expects("requestAsync")->willReturn($promiseMock);
$service = new YouServiceClass($mockDependency);
$service->getPlayer("76245914-d56d-4bac-8419-9e409f43e777");
}并且仅在您的类中进行更改
$promise = $this->someNameService->requestAsync('GET', $this->endpoint, $options);发布于 2016-09-16 19:09:08
我会向您的类注入一个处理器,并将其称为可调用的。看看这个,剩下的很明显:
public function __construct(Processor $processor) {
$this->processor = $processor;
}
public function getPlayer(string $uiid, array &$player = [])
{
$options['query'] = ['id' => $uiid];
$promise = $this->requestAsync('GET', $this->endpoint, $options);
$promise->then([$this->processor, "processResponse"]);
$player = $this->processor->getPlayer();
return $players;
}和处理器:
class Processor {
private $player;
public function processResponse (ResponseInterface $response) {
$this->player = $response->getBody()->getContents();
}
public function getPlayer() { return $this->player;}
}https://stackoverflow.com/questions/39529406
复制相似问题