具有固定类名的模拟对象会污染我的以下测试

时间:2013-12-20 17:43:47

标签: php unit-testing phpunit

在我们使用的框架中,考虑到类名,有几个操作 因此,在测试时,我必须强制使用mock类名,执行以下操作:

$this->getMock('Model', $methods, array($config), 'ModelFoobars');

可悲的是,我发现这样做会污染我的下列测试。这很奇怪,因为在我正在测试的对象中没有内部缓存(单例模式) 但是,如果我调试我的测试,我会发现我的$model变量是PhpUnit的一个实例,即使它是使用new语法创建的!

$classname = 'ModelFoobars';
$model     = new $classname();

我没有操作码缓存,也没有类似的东西。这真的让我发疯,有什么建议吗?

1 个答案:

答案 0 :(得分:0)

经过大量的测试和调试(我的意思是很多),我终于找到了问题。
当你创建一个新的模拟对象时,PhpUnit会动态地创建新的代码,然后它就会摧毁它 默认情况下,PhpUnit创建随机类名,因此通常没有任何问题;但是,如果强制使用类名,则可以获得“有趣”的结果。由于代码被篡改,该类被推入全球范围! 这意味着,一旦您创建了模拟,您就无法创建另一个具有相同名称的模拟:您将使用第一个模型。

我找到的唯一解决方案是避免使用固定的类名,并始终依赖随机的名称。