我有以下代码,我想确保总是以正确的顺序调用:
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::方法)。