假设我有以下接口:
interface MyInterface
{
public function yieldData();
}
我想创建此接口的模拟,例如:
$mocked_instance = Phake::partialMock(MyInterface::class);
模拟What方法最受欢迎的方式是什么?这是我想出的最好的:
Phake::when($mocked_instance)->yieldData()->thenReturn([]);
在PHPUnit/Phake中,有没有一种方法可以更接近于函数的原始功能(即返回Generator)?
发布于 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));
发布于 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...
}
}
发布于 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();
https://stackoverflow.com/questions/41343279
复制相似问题