在我们使用的框架中,考虑到类名,有几个操作 因此,在测试时,我必须强制使用mock类名,执行以下操作:
$this->getMock('Model', $methods, array($config), 'ModelFoobars');
可悲的是,我发现这样做会污染我的下列测试。这很奇怪,因为在我正在测试的对象中没有内部缓存(单例模式)
但是,如果我调试我的测试,我会发现我的$model
变量是PhpUnit的一个实例,即使它是使用new
语法创建的!
$classname = 'ModelFoobars';
$model = new $classname();
我没有操作码缓存,也没有类似的东西。这真的让我发疯,有什么建议吗?
答案 0 :(得分:0)
经过大量的测试和调试(我的意思是很多),我终于找到了问题。
当你创建一个新的模拟对象时,PhpUnit会动态地创建新的代码,然后它就会摧毁它
默认情况下,PhpUnit创建随机类名,因此通常没有任何问题;但是,如果强制使用类名,则可以获得“有趣”的结果。由于代码被篡改,该类被推入全球范围!
这意味着,一旦您创建了模拟,您就无法创建另一个具有相同名称的模拟:您将使用第一个模型。
我找到的唯一解决方案是避免使用固定的类名,并始终依赖随机的名称。