gpt4 book ai didi

php - 在 PHPUnit 中模拟时在回调中通过引用传递

转载 作者:可可西里 更新时间:2023-10-31 23:10:51 26 4
gpt4 key购买 nike

我有一个我想模拟的接口(interface),并模拟其中一个方法的行为。

所以我创建了一个非常简单地模拟行为的回调。

如果我创建一个基于此接口(interface)的新对象,则此测试通过,但我想模拟该接口(interface)。

模拟的 setUp 方法被正常调用,并且在我的回调中调用 getVar('testing') 返回值。但是我的断言失败了,因为该值不可用。

在 PHPUnit 中似乎不能这样做?除非我是傻子。

代码流程的简要说明; “getVar”中的代码调用了一个方法,该方法在添加的插件上调用“setUp”。当它调用“setUp”时,它传入“$this”。这是我期望通过引用传递的 $this,它适用于“真实”对象。

class DefaultRendererTest extends \PHPUnit_Framework_TestCase
{

public function testSetGetVar()
{
$theme = $this->getMock('ThemeInterface');

$plugin = $this->getMock('PluginInterface');
$plugin->expects($this->once())
->method('setUp')
->will($this->returnCallback(function($r){

$r->setVar('testing', "fooBar");

}));

$renderer = new DefaultRenderer($theme, null);
$renderer->addPlugin($plugin);
$this->assertEquals('fooBar',$renderer->getVar('testing'));
}
}

这里的信息是接口(interface),DefaultRenderer 实现了一个 RendererInterface

interface PluginInterface
{
function setUp(RendererInterface $renderer);
}

最佳答案

好的,出于兴趣,我追踪到了这个问题。似乎 PHPUnit 会在实际调用发生之前自动克隆参数。我看不出真正的原因,但也许有一个。看看 Framework/MockObject/Invocation/Static.php,只有一种方法可以避免这种情况(基于内置的模拟代码):实现私有(private) __clone () DefaultRenderer 中的方法。

我还建议您在 IRC 或 PHPUnit 邮件列表上询问有关此行为或模拟对象库的信息。

关于php - 在 PHPUnit 中模拟时在回调中通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5170747/

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