如何模拟其他类实例,phpunit



我有下面的代码。如何在不执行$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);
}

最新更新