为什么是
$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()
的调用返回。