1

为什么是这样:

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

不一样:

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

尝试两者结合

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

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

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

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

4

1 回答 1

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

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

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

这一行利用 PHPUnit 提供的 fluent 接口从模拟中构建您想要的行为。这里我们实际上并没有使用返回类型,因为它没有分配给任何变量,但是如果我们查看它,我们会发现它是 type PHPUnit_Framework_MockObject_Builder_InvocationMocker。这将允许我们链接其他行为,例如

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

你的第二个例子:

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

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

于 2013-08-06T20:31:52.117 回答