模拟框架返回具有不同名称和类型的类
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 Object
或Mock_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 将停止向您显示其“无效参数类型”警告。以上是关于模拟框架返回具有不同名称和类型的类的主要内容,如果未能解决你的问题,请参考以下文章