Symfony2 PHPUnit,测试时间稍长,与Monolog相关的致命错误


Symfony2 PHPUnit, slightly long test, fatal error related to Monolog

我已经将问题缩小到一个单一的单元测试,它涉及一个非常干净的dbal查询。查询涉及嵌套集,当我从3到4个层次类别时,就会发生失败。在执行时间方面几乎没有变化。。我使用的功能在10级时没有问题。然而,在PhpUnit中,当我用4个或更多级别运行测试时,我会遇到一个致命的错误。

*总之,一个可能比平时多花费一瞬间的查询,或者一个选项卡上多一点的资源,会让我在PHPUnit*中获得php fatal error

错误看起来像这样:

致命错误:在第92行调用/var/www/my-app/vendor/symfony/symfoy/Component/HttpKernel/Debug/Stopwatch.php中未定义的方法Monolog''Formatter''LineFormatter::stopEvent()

这里有人在第92行也出现了phpUnit致命错误问题。它可能有关联吗??

我在下面列出了一些绕过我的问题的奇怪方法,但我仍然想知道为什么这样一个基本的测试似乎会导致这个问题。

  • processIsolation设置为"true"的情况下运行PhpUnit
  • 不要访问setUpBeforeClass()方法中的static::createClient();

#symfony(Stof)的一位受人尊敬的成员表示,我似乎不恰当地将@logger DI'ing到了一个服务中。。但我已经通过从我的任何服务中删除记录器服务来确认这似乎不是问题。

也许这个问题与超时有关?(错误提到stopeventstopwatch)。或者这个错误可能与访问setUpBeforeClass()中的$client = static::createClient();有关。。然后在前面的测试中再次访问。。不管这让我很困惑,据我所知,Symfony2(2.1.1)安装中的其他一切都很好。

*Stopwatch.php的第92行…此处为github源文件*

 /**
 * Stops an event.
 * @param string $name The event name
 * @return StopwatchEvent A StopwatchEvent instance
 */
public function stop($name)
{ return end($this->activeSections)->stopEvent($name);}

好。因此,您从$this->activeSections数组中获取最后一项,然后他们尝试在其上运行stopEvent()方法。在这种情况下,LineFormatter类似乎没有可用的方法。

我不熟悉Monolog,但简单看一下他们最新的GitHUb repo,我可以看到它继承的LineFormatter或NormalizerFormatter类都没有这样的方法。

Monolog似乎和Symfony玩得不太好。如果不修改Monolog和/或Symfony Stopwatch类,您将无法使用Stopwatch来评测Monolog相关代码。