Php,如何模拟对象实例化


Php, how to mock object instantiation?

那么,一个函数:

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);
}

如果这看起来有点笨拙,可以考虑将函数移动到一个类中。