PHPUnit - 在不同的模拟上断言方法调用顺序

时间:2016-05-31 17:53:24

标签: php unit-testing mocking phpunit

我想测试一个只调用我的实体对象的方法并将其持久保存到数据库的方法。

public function setNameAndPersistObject($entityObject) {
    $entityObject->setName("John");
    $this->entityManager->persist($entityObject);
}

$ entityObject和$ entityManager都是模拟,而不是实际的对象。

我想测试被调用方法的调用顺序,以测试在'setName'之后调用'persist',因此新名称“John”被保存在数据库中。我如何在PHPUnit中做到这一点?

1 个答案:

答案 0 :(得分:0)

嗯......不确定这是否是最好/最干净的方法,但最近我需要检查方法之间的顺序,这对我有用:你可以简单地有一个变量并通过参考使用它们方法。例如:

$name=null;
$mock1 = $this
    ->getMockBuilder(Entity::class)
    ->setMethods(['setName'])
    ->getMock();
$mock1->expects($this->any())
    ->method('setName')
    ->willReturnCallback(function($value) use (&$name) {
        $name = $value;
    });
$mock2 = $this
    ->getMockBuilder(EntityManager::class)
    ->setMethods(['persist'])
    ->getMock();
$mock2->expects($this->any())
    ->method('persist')
    ->willReturnCallback(function($object) use (&$name) {
        $this->assertNotNull($name);
    });

至少应该这样做。请注意,如果使用相同的变量创建更多的模拟以保存名称,它将失败。另一种选择是在第一个模拟中包含一个函数,用于返回存储在name中的值,并在第二个模拟中调用该函数。这不是完美的,但仍然有点安全。