【问题标题】:PHPUnit Testing Interactions of Multiple ObjectsPHPUnit 测试多个对象的交互
【发布时间】:2014-10-02 07:13:07
【问题描述】:

我希望确保始终以正确的顺序调用以下代码:

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

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

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

【问题讨论】:

    标签: php unit-testing phpunit


    【解决方案1】:

    使用 Mockery 创建模拟,因为它支持应在不同模拟中按顺序调用的期望。诀窍是“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 expectations docs.进行了解释

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

    【讨论】:

    • 看起来不错,但我希望有一个原生的 phpunit 解决方案。我不太热衷于在我的项目中包含更多依赖项。
    • 我添加了另一种可能的方式来做到这一点,而无需任何模拟库。无论如何,“不再依赖”条款不在问题中,所以......
    猜你喜欢
    • 1970-01-01
    • 2013-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-17
    相关资源
    最近更新 更多