如何测试仅使用PHPUnit调用了模拟的特定方法

时间:2018-10-08 16:29:51

标签: php mocking phpunit

我有一个要模拟的类,并确保只调用了其中一个方法。如何在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);
}

1 个答案:

答案 0 :(得分:2)

method函数同时接受字符串和Constraint类。 PHPUnit测试可以使用实用工具功能isNullcontainsmatches创建约束类。在示例中,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/')));