2

私は問題を単一のユニットテストに絞り込みました。これには、かなりクリーンなdbalクエリが含まれます。クエリには入れ子集合が含まれ、階層カテゴリの3レベルから4レベルに移動すると失敗します。実行時間の点でほとんど変更はありません。そして、私が使用している機能は10レベルで問題ありません。ただし、PhpUnitで4つ以上のレベルでテストを実行すると、致命的なエラーが発生します。

*要約すると、通常よりも1秒以上かかる可能性のあるクエリ、またはタブで少し多くのリソースが必要になりphp fatal errorますPHPUnit*

そして、エラーは次のようになります。

致命的なエラー:92行目の/var/www/my-app/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/Debug/Stopwatch.phpの未定義のメソッドMonolog \ Formatter \ LineFormatter :: stopEvent()を呼び出す

ここの誰かが92行目でもphpUnitの致命的なエラーの問題を抱えていました。関係ありますか?

私は私の問題を回避するためのいくつかの風変わりな方法(以下)をリストしましたが、なぜそのような基本的なテストがこの問題を引き起こしているように見えるのか知りたいです。

  • processIsolation「true」に設定してPhpUnitを実行します。
  • static::createClient();setUpBeforeClass()メソッドでにアクセスしないでください

#symfony(Stof)の尊敬されているメンバーに、@ loggerをサービスに不適切にDIしているようだと提案してもらいました。しかし、これはロガーサービスを利用したことによるものではないことを確認しました。私のサービスのいずれかから。

たぶん、この問題はタイムアウトと関係がありますか?(エラーはとに言及stopeventしますstopwatch)。あるいは、このエラーはでのアクセスと関係があるかもしれません。その後、アクセス$client = static::createClient();setUpBeforeClass()前のテストで再び行われます。それにもかかわらず、私は混乱しています。私が知る限り、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);}
4

1 に答える 1

1

わかった。したがって、配列から最後の項目を取得すると、その項目でメソッド$this->activeSectionsを実行しようとします。stopEvent()この場合、LineFormatterクラスにはそのメソッドが使用できないように見えます。

私は Monolog には詳しくありませんが、最新の GitHUb リポジトリをざっと見てみると、継承元の LineFormatter クラスにも NormalizerFormatter クラスにもそのようなメソッドがないことがわかります。

Monolog は Symfony とうまく連携していないようです。また、Monolog や Symfony の Stopwatch クラスを変更しないと、Stopwatch を使用して Monolog 関連のコードをプロファイリングすることはできません。

于 2012-09-14T19:45:05.037 に答える