Unit testing 如何模拟其他类实例,phpunit?

Unit testing 如何模拟其他类实例,phpunit?,unit-testing,mocking,phpunit,Unit Testing,Mocking,Phpunit,我有下面的代码。如何在不执行$video->run()的情况下对run函数进行单元测试 实际上,我怎样才能模仿$video->run()调用下面的代码?有可能吗 class Runner { ... public function run() { $task = $this->getTask(); switch ( $task->getType() ) { case Task::TYPE_VIDEO:

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

}

简单的方法是在类中创建一个新方法

然后,您必须模拟getVideo并返回一个模拟的视频对象,然后才能在模拟的视频对象中模拟方法的运行

这不是最好的办法,但这是可能的

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);
}
您可以使用模拟$video->run()方法调用。首先,使用“实例模拟”为视频类创建模拟,如下所示:

$videoMock = Mockery::mock('overload:MyNamespace\Video');
这将在创建视频类的新实例时进行“拦截”,并使用
$videoMock
。创建“$videoMock”时,只需为给定方法添加一个期望声明:

$videoMock->shouldReceive('run')->once();

可能会提供一些关于如何使用该框架的好信息。

谢谢!看起来很有趣。我试试看。