Mockery如何断言类实例

时间:2014-11-21 14:57:47

标签: php symfony testing mockery

有没有办法嘲笑断言模拟对象应该返回某个类实例?一个被嘲笑的对象应该如何实现呢?

让我们说我正在使用一个模拟的实体管理器+存储库,它返回一个模拟的MyClass对象。

我正在测试一个worker类,它应该使用存储库返回一个MyClass实例(显然不是一个模拟的Myclass)。

问题是,当我注入模拟的实体管理器+存储库时,在工作者内部它正在使用MockedMyClass实例,当存储库"从db"获取东西时,它返回MockedMyclass对象,只是因为模拟的存储库返回一个模拟对象。

我应该如何创建这样的测试? 作为参考,这是我如何创建模拟对象

protected function getMockEM($empty = self::REPO_NOT_EMPTY)
{
    $emMock = M::mock('Doctrine\ORM\EntityManager', array(
            'persist' => null,
            'remove' => null,
            'flush' => null,
            'getRepository' => $this->getMockRepository($empty)
    ));
    return $emMock;
}

public function getMockMyClass()
{
    $pnMock = M::mock('MyNamespace\MyClass', array(
            'getUser'               =>  $this->getMockUser(),
            'getSchedule'           =>  $this->getMockSchedule($this->getDefaultStartingScheduleTime()),
            'getStartingTime'       =>  $this->getDefaultStartingScheduleTime(),
            'getNotificationTime'   =>  $this->getDefaultStartingScheduleTime()->modify("- ".$this->getDefaultNotificationTime()." minutes")
    ));

    return $pnMock;
}

public function getMockRepository($empty = self::REPO_NOT_EMPTY)
{
    if ($empty) {
        $repoMock = M::mock('Doctrine\ORM\EntityRepository', array(
            'findOneBy' => null
        ));
    } else {
        $repoMock = M::mock('Doctrine\ORM\EntityRepository', array(
            'findOneBy' => $this->getMockMyClass()
        ));
    }


    return $repoMock;
}

....

$this->assertSame('MyClass',get_class($worker->doMethodThatShouldReturnaMyClassInstance()));

1 个答案:

答案 0 :(得分:1)

当MockedMyClass扩展MyClass时,您可以使用assertInstanceOf检查返回的对象是否是MyClass的实例。

$this->assertInstanceOf('MyClass', $worker->doMethodThatShouldReturnaMyClassInstance());