【问题标题】: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) 方法可以在测试中自动生成一个可以充当测试替身的对象对于指定的原始类型(接口或类名)。此测试双重对象可用于预期或需要原始类型对象的每个上下文。

标签: php symfony phpunit type-hinting


【解决方案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 是私有的,不能直接设置给对象,所以你想使用反射功能。我的假设是您已经阅读了我在答案中发布的链接背后的文档,因为您似乎对反射的工作原理有一个普遍的误解。无论如何检查我更新的代码如何使用反射来设置私有属性的值。
  • 我不知道我以前做了什么,但它似乎太有用了!非常感谢
猜你喜欢
  • 1970-01-01
  • 2011-06-06
  • 2016-09-15
  • 2011-09-09
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
  • 2013-12-01
  • 2021-02-12
相关资源
最近更新 更多