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();
假设我有这个代码块:
$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();