我有下面的代码。如何在不执行$video->run()的情况下对run函数进行单元测试
实际上,我该如何嘲笑$video->run()调用下面的代码?这可能吗?
class Runner
{
...
public function run()
{
$task = $this->getTask();
switch ( $task->getType() ) {
case Task::TYPE_VIDEO:
$video = new Video( $task );
$video->run();
return 1;
break;
default:
echo "Not implemented task runner";
return 9;
break;
}
}
}
您可以使用Mockery来模拟$video->run()方法调用。首先,您通过使用";instance mock";像这样:
$videoMock = Mockery::mock('overload:MyNamespaceVideo');
这将";"截距";当创建视频类的新实例并且将使用CCD_ 1时。创建"$videoMock"时,您只需要为给定方法添加一个期望声明:
$videoMock->shouldReceive('run')->once();
Mockery快速参考可能会提供一些关于如何使用该框架的好信息。
简单的方法是在类中创建一个新方法。
然后你必须模拟getVideo并返回一个模拟的Video对象,然后你可以模拟方法运行,在模拟对象中也可以模拟Video。
这不是最好的方法,但这是可能的。
public function run()
{
$task = $this->getTask();
switch ($task->getType()) {
case Task::TYPE_VIDEO:
$this->getVideo($task)->run();
return 1;
break;
default:
echo "Not implemented task runner";
return 9;
break;
}
}
protected function getVideo($task)
{
return new Video($task);
}