phpunit检查是否在测试的类上调用了方法

jvr*_*rnt 2 php phpunit

可以说我有以下代码块:

$i = 1;

if ($i > 1) {
    $this->methodOne();
} else {
    $this->methodTwo();
}
Run Code Online (Sandbox Code Playgroud)

如何检查我的PHPUnit测试中是否从已测试的类调用methodOne或methodTwo?

Cri*_*tik 5

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)

  • 我知道我可以单独模拟和测试这些方法,我正在寻找的是测试 methodOne 是从被测试单元本身调用的。如果我测试 MainMethod() 在某些情况下调用 methodOne() - 我想检查它是否被调用 (3认同)