【问题标题】:PHPUnit method invocation assertion failing for abstract class抽象类的 PHPUnit 方法调用断言失败
【发布时间】:2014-05-02 00:19:35
【问题描述】:
我正在模拟一个抽象类,并使用expects 来验证特定方法是否被调用了两次,并带有一些特定的值。这个断言失败了,即使生产代码是正确的。这是我使用getMockForAbstractClass 方法创建模拟的时候。现在,当我创建这个抽象类的具体派生并将其输入getMock 时,它确实有效。然而,这种方法并不好,所以我想知道我是否可以避免它。
第一次尝试,使用无效的getMockForAbstractClass:http://pastebin.com/09n92Q6h
第二次尝试,使用具体派生,确实有效:http://pastebin.com/SxxgN5Cw
【问题讨论】:
标签:
php
unit-testing
mocking
phpunit
abstract-class
【解决方案1】:
在ocramius 的帮助下,我发现抽象类的具体方法默认不会被模拟出来。需要在getMockForAbstractClass中指定需要mock的具体方法。
private function getMockedAbstractClass($className, array $methods)
{
return $this->getMockForAbstractClass(
$className,
array(),
'',
true,
true,
true,
$methods
);
}
为此使用模拟构建器界面会更好:
$platform = $this->getMockBuilder($className)
->setMethods($methods)
->getMockForAbstractClass();
完整的解决方案可以在这里看到:https://github.com/doctrine/dbal/pull/586/files