模拟框架返回具有不同名称和类型的类

Posted

技术标签:

【中文标题】模拟框架返回具有不同名称和类型的类【英文标题】:Mock frameworks returns class with different name and type 【发布时间】:2012-07-25 13:30:54 【问题描述】:

我正在尝试使用此代码创建一个模拟来满足类型提示(模拟):

return \Mockery::mock('\Contracts\Helpers\iFileSystemWrapper');

或者这个(phpUnit):

return $this->getMock('\Contracts\Helpers\iFileSystemWrapper');

但返回的模拟名为Mockery\Mock ObjectMock_iFileSystemWrapper_a5f91049。当它不是我需要的任何一个框架的实例时,我应该如何输入检查?

mock 框架究竟为什么要加载真实的类?如果我想要真正的班级,我会包括真正的班级。

这个问题让我在编写测试时放慢了很多次,我将把类型提示扔出窗口并检查类名,或者干脆使用生产对象,因为模拟使用起来很痛苦。

【问题讨论】:

显示var_dump($mock instanceof \Contracts\Helpers\iFileSystemWrapper); 的结果,其中$mock 是此代码返回的内容 我也遇到了 PHPUnit 的问题,这让我很抓狂。有时模拟是接口,有时不是。 【参考方案1】:

我刚刚对自己的现有测试进行了试验,通过将接口名称空间名称从存在的名称更改为不存在的名称,我得到的结果与您描述的完全相同(使用 phpunit)。我的模拟对象具有类名Mock_ViewInterface_c755461e。当我将它改回正确的接口名称时,它工作正常。

因此我会说:

    您正在尝试使用不存在的接口名称(例如,拼写错误或缺少命名空间组件)。 由于某种原因,您的库代码没有被加载,例如在您的单元测试引导程序中未正确设置自动加载。

【讨论】:

【参考方案2】:

你需要使用一个特殊的函数来检查基类。 像这样的东西:

$mock = $this->getMock('MyClass');
$this->assertInstanceOf('MyClass', $mock);

【讨论】:

这仅测试模拟对象是您已经提供的类或接口的实例,这实际上只是测试测试框架:-) 但是,如果您改为使用常规 if 语句和instanceof 运算符,那么一个好的 IDE 将停止向您显示其“无效参数类型”警告。

以上是关于模拟框架返回具有不同名称和类型的类的主要内容,如果未能解决你的问题,请参考以下文章

C#中具有相同名称和签名但返回类型不同的方法

C#中具有相同名称和签名但返回类型不同的方法

具有相同名称但参数和返回类型不同的虚拟函数[重复]

热门模拟具有不同类型返回值的函数?

如果它们位于不同的文件夹中,是不是可以有两个具有相同名称的类?

静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。