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

时间:2015-07-18 20:39:42

标签: php mocking phpunit

所以,一个功能:

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

如何模仿这个创作?

1 个答案:

答案 0 :(得分:4)

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

如果这是一个类的方法,那么简单的解决方案就是使$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);
}

如果这看起来有点笨拙,请考虑将该功能移到一个类中。