【问题标题】:How to test an method that has like parameter the mock name class如何测试具有类似参数模拟名称类的方法
【发布时间】:2018-03-10 17:35:40
【问题描述】:

我有一个这样的方法

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);

如何测试?

【问题讨论】:

    标签: php unit-testing testing mocking phpunit


    【解决方案1】:

    您的问题是 PHPUnit 扩展了类以模拟它们并为它们分配随机名称。我看到了两个(在我看来,骇人听闻的)选项:

    首先,更糟糕的是,因为您需要修改生产代码。您可以使用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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多