制作反射类传递类型提示
Posted
技术标签:
【中文标题】制作反射类传递类型提示【英文标题】:Make a reflection class pass type hinting 【发布时间】:2018-03-20 09:34:20 【问题描述】:我想对一个类进行单元测试,我需要模拟实体。
综上所述,我需要做一个childEntity
的反射类,以便设置它的ID,然后调用
parentEntity->addChild($childEntity)
问题是addChild()
在childEntity
上被提示类型,当我发送ReflectionClass
时抛出异常
有什么方法可以让方法认为参数是一个有效的类?
编辑:我忘了提到childEntity
中的setId()
不存在。这是一个由 Doctrine 处理的自增字段。
【问题讨论】:
你在使用 phpUnit 吗?如果是,请参阅Test doubles 你可以这样使用它$stub = $this->getMockBuilder($childEntityClassName)->getMock();
PHPUnit 提供的 createMock($type) 和 getMockBuilder($type) 方法可以在测试中自动生成一个可以充当测试替身的对象对于指定的原始类型(接口或类名)。此测试双重对象可用于预期或需要原始类型对象的每个上下文。
【参考方案1】:
使用ReflectionProperty::setValue 将值设置为类实例的属性。然后将实例本身作为参数传递,而不是 Reflection 类。例如:
$reflectionClass = new ReflectionClass('ChildEntity');
$childEntity = new ChildEntity();
$reflectionProperty = $reflectionClass->getProperty('ID');
$reflectionProperty->setAccessible(true);
$reflectionProperty->setValue($childEntity, 1);
$parentEntity->addChild($childEntity);
这不是一个模拟。
有一个工作示例可以使用:https://repl.it/MTWf
【讨论】:
感谢您的回答,但不幸的是,setId
不存在,因此这会产生错误说明 Cannot access non-public member
@Hakim,我不确定setId
是从哪里弹出来的。我知道 ID 是私有的,不能直接设置给对象,所以你想使用反射功能。我的假设是您已经阅读了我在答案中发布的链接背后的文档,因为您似乎对反射的工作原理有一个普遍的误解。无论如何检查我更新的代码如何使用反射来设置私有属性的值。
我不知道我以前做了什么,但它似乎太有用了!非常感谢以上是关于制作反射类传递类型提示的主要内容,如果未能解决你的问题,请参考以下文章
Symfony3 表单组件试图将 null 传递给 PHP 7 中的类型提示方法