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

时间:2016-01-14 10:30:58

标签: unit-testing mocking phpunit

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

}

2 个答案:

答案 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可能会提供有关如何使用框架的一些很好的信息。