phpunit 检查是否在测试中调用了方法 class

phpunit check if method was called on the tested class

假设我有这个代码块:

$i = 1;

if ($i > 1) {
    $this->methodOne();
} else {
    $this->methodTwo();
}

如何检查我的 PHPUnit 测试中是否从被测试的 class 调用了 methodOne 或 methodTwo?

方法一和方法二是public?如果是,那么您也可以为这些添加测试以确保它们正常工作,因此您可以针对方法的其他代码进行断言。如果它们不是 public,那么根据讨论中方法的输出,您可以判断调用了哪个方法。

最后我认为您更感兴趣的是 class 行为是否正确,而不是调用方法的内部链。还要记住,单元测试应该做黑盒测试,不应该关心被测试方法的实现。

而且并非最后,对 $this 上调用的方法断言将使您的测试与 class 的实现严重耦合。因此,如果您重构 class,您还需要更新不再有效的测试。如果内部方法按照您需要的顺序被调用,则测试变得更加困难。

抛开所有这些谈话,这并不意味着您所要求的无法完成。您可以使用部分模拟 (https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects),并在部分模拟上执行断言,而不是创建新的测试对象。例如:

$testedObject = $this->getMock('MyClass',array('methodOne', 'methodTwo'))

将为您提供一个对象,其中只有 methodOne 和 methodTwo 被 PHPUnit 替换。然后,您可以对需要调用的方法设置预期:

$testedUnit = $this->getMock('MyClass',array('methodOne', 'methodTwo'));
$testedUnit->expects($this->once())
    ->method('methodOne');
// setup the condition so that the tested method calls methodOne()
// ...
$testedUnit->testedMethod();