【问题标题】:How to test that only specific methods of a mock were called with PHPUnit如何测试仅使用 PHPUnit 调用模拟的特定方法
【发布时间】:2019-03-13 09:01:56
【问题描述】:

我有一个要模拟的类,并确保只调用了它的一个方法。如何在 PHPUnit 中构造这样的模拟对象?类似的东西

public function testSystemUnderTestOnlyInvokesFoo() {
    $myMock = $this->createMock(ClassWithManyMethods::class);
    $myMock->expects($this->once())->method('foo');

    // Something like this
    // $myMock->expects($this->never)->method($this->anyMethodExcept('foo'))

    function_under_test($myMock);
}

【问题讨论】:

    标签: php mocking phpunit


    【解决方案1】:

    method 函数接受字符串和Constraint 类。 PHPUnit 测试可以使用isNull、contains 或matches 等实用函数创建约束类。在示例中,anyMethodExcept 转换为如下代码:

    public function testSystemUnderTestOnlyInvokesFoo() {
        $myMock = $this->createMock(ClassWithManyMethods::class);
        $myMock->expects($this->never)
           ->method($this->logicalNot($this->matches('foo')));
        $myMock->expects($this->once())->method('foo');
    
        function_under_test($myMock);
    }
    

    如果您有多个要排除的方法,请像这样使用matchesRegex:

    $myMock->expects($this->never)
       ->method($this->logicalNot($this->matchesRegex('/foo|bar|baz/')));
    

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 2017-02-27
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-18
      • 2020-05-13
      • 1970-01-01
      相关资源
      最近更新 更多