那么,一个函数:
function testMe ($a, $b)
{
$obj = new CalculationObject();
return $obj->calcIt ($a, $b);
}
如何模拟这个创建?
重构函数以分离对象创建和对象使用。
如果这是一个类的方法,简单的解决方案是使$obj
成为一个类属性,这样您就可以用mock替换它。
如果总是需要一个新的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);
}
如果这看起来有点笨拙,可以考虑将函数移动到一个类中。