【发布时间】:2021-10-23 11:36:10
【问题描述】:
我有一堂课:
class a
{
public function b()
{
$arg1 = $this->service1->getArg1();
$arg2 = $this->service2->getArg2();
$result = $this->d($arg1, $arg2);
if ($result) {
return true;
}
return false;
}
public function c()
{
$arg1 = $this->service3->getArg1();
$arg2 = $this->service4->getArg2();
$result = $this->d($arg1, $arg2);
if ($result) {
return true;
}
return false;
}
protected function d($arg1, $arg2)
{
if ($arg1 == $arg2) {
// do something
// call service 5, service 6
return $result;
}
// do something
// call service 5, service 6
return null;
}
}
公共函数 b 和 c 都调用私有函数 d。如果我为函数 b 和 c 编写测试,我将至少有 2 种情况:每个函数测试的“arg1 等于 arg2”和“arg1 不等于 arg2”。以下哪个解决方案是正确的? :
- 解决方案 1:函数
testb有 2 个案例,我必须为服务 5,6 创建模拟。然后函数testc我有2个案例,也为服务5,6创建模拟。我发现这是非常重复的工作量,因为我必须“通过”函数 d 两次。 - 解决方案 2:我不在乎
$arg1和$arg2的值。我模拟函数 d,期望它返回我想要的任何值。然后我最后我会写一个函数testd。但我没有这个解决方案的技术。 - 解决方案 3:将函数 d 分离到一个新类
serviceD并公开它。然后将serviceD注入类a。现在功能b和c喜欢:
$result = $this->serviceD->d($arg1, $arg2);
我很容易模拟 serviceD。但是,如果我不想创建新课程?我仍然想使用解决方案 2。
【问题讨论】:
标签: php unit-testing phpunit