2014-10-31 132 views
0

类中的方法中实例化一个对象,我测试的样子:是否有可能嘲笑被测试

function X($arg) 
{ 
    // Code ... 
    $object = new Object; 
    // Code ... 
} 

有没有办法来嘲笑那个对象?

回答

1

不能在单元测试中使用PHPUnit模拟对象,您不能。

根据你如何加载你的类,你将能够创建一个“模拟”类来取代该对象。这将是这样的:

您的测试文件:

class Object { 
    <mock functionality here> 
} 

class TestCase extends PHPUnit_Framework_TestCase { 
<your tests> 
} 

但是,如果你想在另外一个测试来实际测试Object这会导致问题。在这种情况下,您将收到一个致命错误,指出您无法重新定义班级。 这不是最佳做法。

最好的办法是重构类,以便使用依赖注入。更改该类,以便将Object作为构造函数参数或是方法签名的一部分。

这篇文章可能会有所帮助:http://misko.hevery.com/2008/07/08/how-to-think-about-the-new-operator/

+0

谢谢,我会使用依赖注入normaly,但我测试的代码我没写,也没有依赖注入,它有脂肪,真正的脂肪控制器。 – teeyo 2014-10-31 15:37:48

+1

对于控制器,我发现你最终会得到大多数人认为是“集成”测试的东西。通过这种方式,您可以对API进行初始端到端测试,让您使用DI – Schleis 2014-10-31 15:53:13

+0

重构我开始感觉到我正在重复自我,使用PHPUnit进行功能测试并接受Behat验证测试,我想我我们将继续为模型和助手进行单元测试,并为控制器进行验收测试。 – teeyo 2014-11-03 08:41:56