首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用PhpUnit和Prophecy测试以callable作为参数的方法

如何使用PhpUnit和Prophecy测试以callable作为参数的方法
EN

Stack Overflow用户
提问于 2016-09-16 18:36:55
回答 2查看 4K关注 0票数 0

我正在使用Guzzle的异步请求,并在我现在想要测试的服务中实现它们。

我的方法看起来像这样(伪的,所以如果它不是100%有效,请原谅)

代码语言:javascript
复制
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.

这就是我目前的实现方式

代码语言:javascript
复制
/** @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。有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2016-09-16 20:42:13

我有了另一个想法。

创建一个将在requestAsync()中生成的依赖项;然后创建它的mock,它将返回另一个mock of promise。

代码语言:javascript
复制
class PromiseMock
{
    private $response;

    public function __construct(ResponseInterface $response)
    {
        $this->response = $response;
    }

    public function then($callable)
    {
        $callable($this->response);
    }
}

测试看起来像这样

代码语言:javascript
复制
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");
}

并且仅在您的类中进行更改

代码语言:javascript
复制
$promise = $this->someNameService->requestAsync('GET', $this->endpoint, $options);
票数 2
EN

Stack Overflow用户

发布于 2016-09-16 19:09:08

我会向您的类注入一个处理器,并将其称为可调用的。看看这个,剩下的很明显:

代码语言:javascript
复制
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;
}

和处理器:

代码语言:javascript
复制
class Processor {

    private $player;        

    public function processResponse (ResponseInterface $response) {
        $this->player = $response->getBody()->getContents();
    }

    public function getPlayer() { return $this->player;}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39529406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档