gpt4 book ai didi

php - 在 PHPUnit 中实现给定接口(interface)的模拟对象上的未定义方法?

转载 作者:IT王子 更新时间:2023-10-29 00:02:19 25 4
gpt4 key购买 nike

我是单元测试和 PHPUnit 的新手。

我需要一个 mock,我可以完全控制它,实现 ConfigurationInterface 接口(interface)。测试对象是ReportEventParamConverter对象,测试必须检查我的对象和接口(interface)的交互。

ReportEventParamConverter 对象(此处简化):

class ReportEventParamConverter implements ParamConverterInterface
{
/**
* @param Request $request
* @param ConfigurationInterface $configuration
*/
function apply(Request $request, ConfigurationInterface $configuration)
{
$request->attributes->set($configuration->getName(), $reportEvent);
}

/**
* @param ConfigurationInterface $configuration
* @return bool
*/
function supports(ConfigurationInterface $configuration)
{
return 'My\Namespaced\Class' === $configuration->getClass();
}
}

这就是我试图模拟界面的方式:

$cls = 'Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface';
$mock = $this->getMock($mockCls);

我需要模拟两种方法的返回值:getClass()getName()。例如:

$mock->expects($this->any())
->method('getClass')
->will($this->returnValue('Some\Other\Class'))
;

当我创建一个新的 ReportEventParamConverter 并测试 supports() 方法时,我得到以下 PHPUnit 错误:

Fatal error: Call to undefined method Mock_ConfigurationInterface_21e9dccf::getClass().

$converter = new ReportEventParamConverter();
$this->assertFalse($converter->supports($mock));

最佳答案

是因为ConfigurationInterface中没有声明getClass方法。此接口(interface)中的唯一声明是方法“getAliasName”。

您只需要告诉 mock 您将对哪些方法进行 stubing:

$cls = 'Sensio\Bundle\FrameworkExtraBundle\Configuration\ConfigurationInterface';
$mock = $this->getMock($cls, array('getClass', 'getAliasName'));

请注意,没有“getClass”声明,但您也可以 stub /模拟不存在的方法。因此你可以 mock 它:

$mock->expects($this->any())
->method('getClass')
->will($this->returnValue('Some\Other\Class'));

但除此之外,您还需要模拟“getAliasName”方法,只要它是接口(interface)方法或抽象方法,并且必须“实现”。例如:

$mock->expects($this->any())
->method('getAliasName')
->will($this->returnValue('SomeValue'));

关于php - 在 PHPUnit 中实现给定接口(interface)的模拟对象上的未定义方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12599957/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com