【发布时间】:2015-07-18 20:39:41
【问题描述】:
所以,一个函数:
function testMe ($a, $b)
{
$obj = new CalculationObject();
return $obj->calcIt ($a, $b);
}
如何模拟这个创作?
【问题讨论】:
-
也许你可以用另一种语言添加你通常如何“模拟对象”?
所以,一个函数:
function testMe ($a, $b)
{
$obj = new CalculationObject();
return $obj->calcIt ($a, $b);
}
如何模拟这个创作?
【问题讨论】:
重构函数以分离对象创建和对象使用。
如果这是类的方法,简单的解决方案是将$obj 设为类属性,以便您可以将其替换为模拟。
如果您总是需要CalculationObject 的新实例,可以使用工厂模式。
function testMe ($a, $b)
{
$obj = $this->factory->getNewCalculationObject();
return $obj->calcIt ($a, $b);
}
然后将$this->factory 替换为一个存根,该存根返回您对getNewCalculationObject() 的模拟。
如果这真的是过程函数,而不是方法,则需要将依赖传递给函数:
function testMe ($a, $b, $factory)
{
$obj = $factory->getNewCalculationObject();
return $obj->calcIt ($a, $b);
}
您可以默认使用普通工厂,使其向后兼容您当前的实现:
function testMe ($a, $b, $factory = null)
{
if ($factory === null) {
$factory = new CalculationObjectFactory();
}
$obj = $factory->getNewCalculationObject();
return $obj->calcIt ($a, $b);
}
如果您觉得这有点笨拙,请考虑将函数移到一个类中。
【讨论】: