我有这样的一种方法

public function prePersist(LifecycleEventArgs $event)
{
    $em = $event->getEntityManager();
    $entity = $event->getObject();
    $metadata = $em->getClassMetadata(get_class($entity));

}


我已经测试了getEntityManagergetObject方法,但是现在该测试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

07-28 00:08