phpunit检查是否对测试类调用了方法

phpunit检查是否对测试类调用了方法,php,phpunit,Php,Phpunit,假设我有这个代码块: $i = 1; if ($i > 1) { $this->methodOne(); } else { $this->methodTwo(); } 如何检查在PHPUnit测试中是否从测试类调用了methodOne或methodTwo?methodOne和methodTwo是公共的吗?如果是,那么您也可以为它们添加测试,以确保它们正确工作,因此您可以针对方法的其他代码进行断言。如果它们不是公共的,那么根据讨论中方法的输出,您可以知道调用了

假设我有这个代码块:

$i = 1;

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

如何检查在PHPUnit测试中是否从测试类调用了methodOne或methodTwo?

methodOne和methodTwo是公共的吗?如果是,那么您也可以为它们添加测试,以确保它们正确工作,因此您可以针对方法的其他代码进行断言。如果它们不是公共的,那么根据讨论中方法的输出,您可以知道调用了哪个方法

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

最后,断言调用$this的方法将使您的测试与类的实现严重耦合。因此,如果重构类,还需要更新不再工作的测试。如果内部方法按照您需要的顺序被调用,那么测试就会变得更加困难

把这些话放在一边,并不意味着你所问的事情不能完成。您可以使用partial mock(),并在partial mock上进行断言,而不是创建新的测试对象。例如:

$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();

我知道我可以分别模拟和测试这些方法,我想要的是测试methodOne是从被测试单元本身调用的。如果我正在测试MainMethod(),在某些场景中调用methodOne()-我想检查它是否被调用