PHPUnit测试多个对象的交互

时间:2014-10-02 07:13:08

标签: php unit-testing phpunit

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

class ProcessManager {
    // injected via DI
    protected $service1;
    protected $service2;
    protected $service3;

    public function run() {
        $service1->execute();
        $service2->execute();
        $service3->execute();
    }
}

我正在考虑嘲笑所有服务并使用$this->at(),但这似乎只有来自同一个对象的多个函数才有效。任何想法如何断言不同对象的不同函数按顺序调用?

1 个答案:

答案 0 :(得分:0)

使用Mockery创建模拟,因为它支持应该在不同的模拟中按顺序调用的期望。诀窍是"全球()"方法:

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 expectations docs.

解释了这一点

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