首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用PHPUnit/Phake模拟PHP中返回生成器的函数

用PHPUnit/Phake模拟PHP中返回生成器的函数
EN

Stack Overflow用户
提问于 2016-12-27 18:22:14
回答 3查看 4.3K关注 0票数 6

假设我有以下接口:

interface MyInterface
{
    public function yieldData();
}

我想创建此接口的模拟,例如:

$mocked_instance = Phake::partialMock(MyInterface::class);

模拟What方法最受欢迎的方式是什么?这是我想出的最好的:

Phake::when($mocked_instance)->yieldData()->thenReturn([]);

在PHPUnit/Phake中,有没有一种方法可以更接近于函数的原始功能(即返回Generator)?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-27 22:07:00

感谢Oliver Maksimovic的评论,它帮助我找到了一个适合我的解决方案。

我决定在我的基本测试用例上创建以下函数:

/*
 * @param array @array
 *
 * @return \Generator|[]
 */
protected function arrayAsGenerator(array $array)
{
    foreach ($array as $item) {
        yield $item;
    }
}

这使我可以执行以下操作:

$mocked_instance = Phake::partialMock(MyInterface::class);

$numbers = [1, 2, 3, 4, 5];

Phake::when($mocked_instance)
    ->yieldData()
    ->thenReturn($this->arrayAsGenerator($numbers));
票数 8
EN

Stack Overflow用户

发布于 2019-06-26 07:44:30

我只使用PHPUnit,不想添加Phake或其他测试框架。我发现这个问题最有用的解决方案来自这篇文章:

https://www.gpapadop.gr/blog/2017/11/01/mocking-generators-in-phpunit/

但是,我不喜欢本文中的语法选择,我认为使用帮助器方法generate()更容易理解代码。在幕后,它仍然像文章中那样使用PHPUnit::returnCallback()

下面是一个示例依赖类,其中包含我需要模拟的Generator方法:

class MockedClass 
{
    public function generatorFunc() : Generator
    {
        $values = [1,2,3,4];

        foreach($values as $value)
        {
            yield $value;
        }
    }
}

下面是一个带有generate()帮助器方法的PhpUnit测试类,它实现了上面文章中的解决方案:

class ExampleTest extends \PHPUnit\Framework\TestCase
{
    // Helper function creates a nicer interface for mocking Generator behavior
    protected function generate(array $yield_values)
    {
        return $this->returnCallback(function() use ($yield_values) {
            foreach ($yield_values as $value) {
                yield $value;
            }
        });
    }

    public function testMockedGeneratorExample() 
    {
        $mockedObj = $this->createMock(MockedClass::class);

        $mockedObj->expects($this->once())
            ->method('generatorFunc')
            ->will($this->generate([5,6,7,8]));

        // Run code that uses MockedClass as dependency
        // Make additional assertions as needed...
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-04-18 05:52:20

您可以使用带有first-class support for generators的PHP库Phony

$handle = mock(MyInterface::class);
$handle->yieldData->generates([1, 2, 3, 4, 5])->returns();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41343279

复制
相关文章

相似问题

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