【发布时间】:2018-06-18 23:17:14
【问题描述】:
我最近试图提高我的单元测试技能并阅读了很多关于单元测试的文献,我还试图了解我在我目前正在使用 phpunit 开发的一个 php 项目中学到了什么。但是在我看来,我仍然有一个非常基本的问题,如何对与其他类的对象甚至与同一类的其他方法交互的方法进行单元测试。
是否有一些经验法则或一些帮助我可以决定我应该存根/模拟哪些依赖项以及哪些依赖项我应该简单地使用普通对象?为了澄清我的问题,这里有一个示例代码,具有不同的场景:
interface DependencyInterface {
public method dependentMethod() { ... }
}
class Dependency implements DependencyInterface {...}
class ClassUnderTest {
private $dependency
public __construct(DependencyInterface $dependency) {
$this->dependency = dependency;
}
public function methodUnderTest() {
...
$result1 = $this->dependency->dependentMethod();
...
$result2 = $this->otherMethod();
...
$result3 = $this->usedInMultiplePublicMethods();
}
public function otherMethod() {...}
private function usedInMultiplePublicMethods() {...}
}
所以我现在的问题是针对测试方法 methodUnderTest 的功能的单元测试,我应该:
- 存根接口 DependencyInterface 并将其注入构造函数,还是我应该简单地使用实现 Dependency 的实例?
- 部分存根 ClassUnderTest 类本身,以便为 otherMethod 提供固定结果,因为这个可能非常复杂的方法已经拥有自己的完整单元测试?
- 我决定不对私有方法进行单元测试,因为它们不是类接口的一部分(我知道这是一个有争议的话题,不在我的问题范围内)。我现在是否必须为每个使用私有方法 usedInMultiplePublicMethods 的公共方法涵盖私有方法中可能发生的所有可能影响?还是应该只在使用它的一种公共方法中测试所有可能的影响,并在所有其他公共方法的测试中存根私有方法?
我不太确定何时使用存根/模拟,何时不使用。
【问题讨论】:
标签: php unit-testing mocking phpunit