我有以下代码。如何在不执行 $ video-> 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;
}
}
}
答案 0 :(得分:1)
简单的方法是在课堂上创建一个新方法。
你必须模拟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);
}
答案 1 :(得分:1)
您可以使用Mockery来模拟$ video-> run()方法调用。首先,使用“instance mock”为这个类创建一个模拟:
$videoMock = Mockery::mock('overload:MyNamespace\Video');
当创建Video类的新实例并且将使用$videoMock
时,这将“拦截”。创建'$ videoMock'时,您只需要为给定方法添加期望声明:
$videoMock->shouldReceive('run')->once();
Mockery quick reference可能会提供有关如何使用框架的一些很好的信息。