Joh*_*ith 1 php phpunit mocking
所以,一个函数:
function testMe ($a, $b)
{
$obj = new CalculationObject();
return $obj->calcIt ($a, $b);
}
Run Code Online (Sandbox Code Playgroud)
如何嘲笑这个创作?
重构该函数以分离对象创建和对象使用。
如果这是类的方法,那么简单的解决方案是创建$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)
如果这对您来说看起来有点笨拙,请考虑将该函数移到一个类中。