【问题标题】:Php, how to mock object instantiation?Php,如何模拟对象实例化?
【发布时间】:2015-07-18 20:39:41
【问题描述】:

所以,一个函数:

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

如何模拟这个创作?

【问题讨论】:

  • 也许你可以用另一种语言添加你通常如何“模拟对象”?

标签: php mocking phpunit


【解决方案1】:

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

如果这是类的方法,简单的解决方案是将$obj 设为类属性,以便您可以将其替换为模拟。

如果您总是需要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);
}

如果您觉得这有点笨拙,请考虑将函数移到一个类中。

【讨论】:

  • 我明白了。那么,换句话说,没有直接的对象创建而是使用工厂?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多