Yii&;使用fluent/mmockbuilder进行PHPUnit嘲讽会产生奇怪的结果


Yii & PHPUnit mocking with fluent/mockbuilder gives weird results

为什么是

 $mock = $this->getMock("EventDispatcher");
 $mock->expects($this->once())->method("fireEvent");

与不同

$mock = $this->getMock("EventDispatcher")->expects($this->once())->method("fireEvent");

两者都与一起尝试

Yii::app()->setComponent("dispatch",$mock);

第一个工作,最后一个给出致命错误:

致命错误:无法将PHPUnit_Framework_MockObject_Builder_InvocationMocker类型的对象用作第438行上/var/www/frameworks/yii/base/CModule.php中的数组

我希望这两件事会有同样的结果,还是我只是在完全崩溃的时候写了这段代码?

$mock = $this->getMock("EventDispatcher");

这个初始调用将返回实际的模拟对象。

$mock->expects($this->once())->method("fireEvent");

这一行使用PHPUnit提供的流畅接口来构建您想要的mock行为。这里我们实际上并没有使用返回类型,因为它没有分配给任何变量,但是如果我们查看它,我们会发现它的类型是PHPUnit_Framework_MockObject_Builder_InvocationMocker。这将使我们能够将等附加行为串联起来

$mock->expects($this->once())
     ->method("fireEvent")
     ->with($this->equalTo('expectedParam'))
    ;

第二个例子:

$mock = $this->getMock("EventDispatcher")
                 ->expects($this->once())
                 ->method("fireEvent")
    ;

将以相同的方式创建mock,但是由于方法链接在一行上,因此我们无法访问mock本身。当像这样链接方法调用时,行为是最终调用的返回值变成赋值,但如图所示,这将是PHPUnit_Framework_MockObject_Builder_InvocationMocker。实际的mock将由对getMock()的调用返回,而不是由对method()的调用返回。