PHPUnit测试多个对象的交互


PHPUnit Testing Interactions of Multiple Objects

我有以下代码,我想确保总是以正确的顺序调用:

class ProcessManager {
    // injected via DI
    protected $service1;
    protected $service2;
    protected $service3;
    public function run() {
        $service1->execute();
        $service2->execute();
        $service3->execute();
    }
}

我想模拟所有的服务并使用$this->at(),但这似乎只有在它是来自同一对象的多个函数时才有效。有什么想法可以断言来自不同对象的不同函数是按顺序调用的吗?

使用Mockery创建mock,因为它支持在不同的mock中按顺序调用的期望值。诀窍在于"globally()"方法:

use 'Mockery as m;
....
// create the mocks that will be injected:
$service1 = m::mock('Service1Class')
     ->shouldReceive('execute')
     ->once()
     ->globally()
     ->ordered()
     ->getMock();
$service2 = m::mock('Service2Class')
     ->shouldReceive('execute')
     ->once()
     ->globally()
     ->ordered()
     ->getMock();     

这一切都在Mockery期望文档中进行了解释。

如果您不想使用Mockery,可以使用天真的Mocks(扩展原始类的真实类),并实现某种手动调用顺序检查(如果需要,还可以调用parent::方法)。