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

Joh*_*ith 1 php phpunit mocking

所以,一个函数:

function testMe ($a, $b)
{
    $obj = new CalculationObject();
    return $obj->calcIt ($a, $b);
}
Run Code Online (Sandbox Code Playgroud)

如何嘲笑这个创作?

Fab*_*ler 5

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

如果这是类的方法,那么简单的解决方案是创建$obj一个类属性,以便您可以用模拟替换它。

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

例子:

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

然后替换$this->factory为返回您的模拟的存根getNewCalculationObject()

如果这确实是一个过程函数,而不是一个方法,则需要将依赖项传递给该函数:

function testMe ($a, $b, $factory)
{
    $obj = $factory->getNewCalculationObject();
    return $obj->calcIt ($a, $b);
}
Run Code Online (Sandbox Code Playgroud)

您可以默认使用普通工厂来使其向后兼容您当前的实现:

function testMe ($a, $b, $factory = null)
{
    if ($factory === null) {
        $factory = new CalculationObjectFactory();
    }
    $obj = $factory->getNewCalculationObject();
    return $obj->calcIt ($a, $b);
}
Run Code Online (Sandbox Code Playgroud)

如果这对您来说看起来有点笨拙,请考虑将该函数移到一个类中。