嘲弄如何断言类实例

Posted

技术标签:

【中文标题】嘲弄如何断言类实例【英文标题】:Mockery how to assert class instance 【发布时间】:2015-01-19 18:21:56 【问题描述】:

有没有办法用嘲弄来断言一个模拟对象应该返回一个特定的类实例?一个moked对象应该如何实现呢?

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

我正在使用存储库对一个应该返回 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】:

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

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

【讨论】:

太棒了,我不知道。除了默认指南之外,您碰巧有更多关于嘲弄的资源吗?我发现网上信息很缺乏 是的,它扩展了原始类,以便它可以继续在相同的地方工作,例如在type hints。不幸的是,除了main documentation,我不知道任何好的资源。

以上是关于嘲弄如何断言类实例的主要内容,如果未能解决你的问题,请参考以下文章

VC++ 创建 Cdialog 类断言错误

在 C++ 中,如何测试对象是不是是父类构造函数中子类的实例?

如何用 jest 解开单个实例方法

嘲弄“with”方法没有显示失败的原因

如何使用流体断言 .ShouldBeNull()

Scala嘲弄由另一个特征扩展的特征