可以说我有以下代码块:
$i = 1;
if ($i > 1) {
$this->methodOne();
} else {
$this->methodTwo();
}
Run Code Online (Sandbox Code Playgroud)
如何检查我的PHPUnit测试中是否从已测试的类调用methodOne或methodTwo?
methodOne和methodTwo是公开的吗?如果是,那么您也可以为这些测试添加测试以确保它们正常工作,因此可以针对方法的其他代码进行断言。如果它们不是公共的,则根据讨论中方法的输出,您可以确定调用了哪个方法。
最后,我认为您对类的行为更感兴趣,而不是对调用方法的内部链感兴趣。还请记住,单元测试会进行黑盒测试,因此不要在意被测试方法的实现。
最后,声明在$ this上的方法将使您的测试与该类的实现严重耦合。因此,如果您重构类,则还需要更新不再起作用的测试。而且,测试内部方法是否按您需要的顺序调用变得更加困难。
抛开所有这些话题,并不意味着您所要提出的内容无法完成。您可以使用部分模拟(https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.mock-objects),并对部分模拟进行断言而不是创建新测试宾语。例如:
$testedObject = $this->getMock('MyClass',array('methodOne', 'methodTwo'))
Run Code Online (Sandbox Code Playgroud)
将为您提供一个对象,其中只有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();
Run Code Online (Sandbox Code Playgroud)