我有这样的一种方法
public function prePersist(LifecycleEventArgs $event)
{
$em = $event->getEntityManager();
$entity = $event->getObject();
$metadata = $em->getClassMetadata(get_class($entity));
}
我已经测试了
getEntityManager
和getObject
方法,但是现在该测试getClassMetadata
方法和每个参数了,在这种情况下,它只有一个!get_class($entity)
上一行返回名称类(随机):
Mock_ObjectManager_126b0394
Mock_ObjectManager_cc9f593f
Mock_ObjectManager_8e119a34
它永远不会返回实名类...并且我想在调用
getClassMetadata
时检查第一个参数集。 $test = $this;
$this->em->expects($this->at(0))
->method('getClassMetadata')
->with(
$this->callback(function($arg) use ($test) {
$test->assertThat($arg,
$this->logicalAnd(
$this->equalTo('ObjectManager')
)
);//assertThat
return true;
}) // callback
)
->willReturn($this->objectManager);
如何测试呢?
最佳答案
您的问题是PHPUnit扩展了类以模拟它们并为它们分配了随机名称。我看到两个选项(我认为是hackish):
首先,更糟糕的是,因为您需要修改生产代码。您可以使用get_parent_class()
代替get_class()
,因此您将得到ObjectManager
而不是模拟名称。这显然是不理想的,并且如果ObjectManager
是子类,则根本不起作用(edit get_parent_class()
获取直接父级,而不是最高父级,因此在这种情况下它仍然可以工作-edit2如果ObjectManager
不是子类,它将返回false
并失败,而是尝试从测试内部的名称实例化该类,并断言它是ObjectManager
的子类)。
另一个选项不是很差,但仍然不是很完美,它是检查ObjectManager
是否包含在带有assertContains()
的参数中:
$this->callback(function($arg) use ($test) {
$test->assertContains("ObjectManager", $arg);//assertThat
return true;
}) // callback