让我说我有这个代码块:
$i = 1;
if ($i > 1) {
$this->methodOne();
} else {
$this->methodTwo();
}
如何在我的PHPUnit测试中检查是否从测试类中调用了methodOne或methodTwo?
答案 0 :(得分:4)
methodOne和methodTwo是公开的吗?如果是,那么您也可以为这些添加测试以确保它们正确工作,因此您可以断言您的方法的其他代码。如果它们不是公共的,那么根据讨论中的方法的输出,您可以告诉哪个方法被调用。
最后,我认为你对你的班级行为正确感兴趣,而不是对被调用方法的内部链感兴趣。还要记住,单元测试会进行黑盒测试,不应该关心被测试方法的实现。
并不是最后,在$ this上调用的方法断言会严重将测试与类的实现结合起来。因此,如果您重构该类,您还需要更新不再有效的测试。如果按照您需要的顺序调用内部方法,则更难以测试。
把所有这些话放在一边,并不意味着你提出的问题无法完成。您可以使用部分模拟(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();