Php, 如何模拟对象实例化?

Php, how to mock object instantiation?

所以,一个函数:

function testMe ($a, $b)
{
    $obj = new CalculationObject();
    return $obj->calcIt ($a, $b);
}

如何模拟这个创作?

重构函数以分离对象创建和对象使用。

如果这是 class 的方法,简单的解决方案是将 $obj 设为 class 属性,这样您就可以用模拟替换它。

如果你总是需要CalculationObject的新实例,可以使用工厂模式。

示例:

function testMe ($a, $b)
{
    $obj = $this->factory->getNewCalculationObject();
    return $obj->calcIt ($a, $b);
}

然后将 $this->factory 替换为 returns 您对 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);
}

如果您觉得这看起来有点笨拙,请考虑将函数移动到 class。