2016-09-01 10 views
1

のデバッグ、私は私の設定makeprg PHPUnitのはVimのエラーフォーマット

setlocal makeprg=phpunit\ --configuration\ tests/phpunit.xml

にしかし、その後、それは試してみて、エラーフォーマットの仕事を作るために悪夢であることです。 PHPUnitのの出力はこれです:

PHPUnit 4.8.27 by Sebastian Bergmann and contributors. 

F 

Time: 177 ms, Memory: 12.50MB 

There was 1 failure: 

1) dummy_test::testController 
Failed asserting that 1 matches expected 2. 

/Users/david/Sites/apr2/frontend/intranet/tests/unit/dummy_test.php:44 

FAILURES! 
Tests: 1, Assertions: 1, Failures: 1. 

そして、私が試みerrorformatは次のとおりです。setlocal errorformat=%A%.%#,%C%n\)\ %.%#,%m,%.%#,%Z%f:%l,%-G%.%#

のみ||で行を出力し、どの。これをどのようにデバッグすればよいですか?私は暗闇の中で暴力を振るっているような気がする。

答えて

1

あなたの試みの主な問題は、エラーが期待通りのものにならないことです。実際には次のようになります。エラー行が読み込まれ、順番にerrorformatのルールと一致します。最初のルールマッチが勝つ。次に別のエラー行が読み込まれ、再びerrorformatの規則と順番に一致します。等々。 %>のようなルールが試される順番に影響を与える可能性があり、あるルールから別のルールに情報を渡すサポートは限られていますが、基本的に、エラーラインを他と区別することができない場合は、それを与えられたフィールドに割り当てます。

特に、Failed asserting that 1 matches expected 2.Time: 177 ms, Memory: 12.50MBを区別できない場合は、FTests: 1, Assertions: 1, Failures: 1.からエラーメッセージに含めることはできません。この問題を解決するには、おそらくsyntasticのようにエラーを "前処理"する必要があります。1) dummy_test::testControllerFailed asserting that 1 matches expected 2.を同じ行に解析して解析する必要があります。とにかく

は、念頭に置いてすべてのことで、ここで(this照明柱に基づいて)基本的なフレームワークだ、と等しく粗errorformat

let &errorformat = 
    \ '%-G,' . 
    \ '%-GPHPUnit %.%#,' . 
    \ '%-GF,' .     
    \ '%-GTime: %.%#\, Memory: %.%#,' . 
    \ '%-GThere was 1 failure:,' . 
    \ '%-GFAILURES!,' . 
    \ '%-GTests: %.%#\, Assertions: %.%#\, Failures: %.%#,' . 
    \ '%E%n) %m,' .    
    \ '%C%f:%l,' .    
    \ '%C%m' 
cgetexpr [ 
     \ 'PHPUnit 4.8.27 by Sebastian Bergmann and contributors.', 
     \ '', 
     \ 'F', 
     \ '', 
     \ 'Time: 177 ms, Memory: 12.50MB', 
     \ '', 
     \ 'There was 1 failure:', 
     \ '', 
     \ '1) dummy_test::testController', 
     \ 'Failed asserting that 1 matches expected 2.', 
     \ '', 
     \ '/Users/david/Sites/apr2/frontend/intranet/tests/unit/dummy_test.php:44', 
     \ '', 
     \ 'FAILURES!', 
     \ 'Tests: 1, Assertions: 1, Failures: 1.', 
    \ ] 

echomsg string(map(getqflist(), '[v:val.text, v:val.valid]')) 
echomsg string(getqflist()) 
copen 
wincmd p 

上記errorformatが完全に有用ではない次のように、生成します、どちらかが、完全に役に立たない:

/Users/david/Sites/apr2/frontend/intranet/tests/unit/dummy_test.php|44 error 1| dummy_test::testController 

おそらく、あなたは、既知の固定パターンTime:...There was 1 failure:などを殺害した後、gobblingすることによって、これを向上させることができエラーメッセージの残りの行。あなたはまだ空の行を扱う楽しみを持っています。幸運がそれを捜すのを幸運。 :)

編集:errorformatを変更して、既知の固定パターンを削除しました。あなたはおそらくもう少し手を加える必要があり、結果はまだ壊れやすいでしょう。

+0

ありがとうございます!これはとても役に立ちました!今私は '%m'メッセージに2行目を追加しようとしていますが、私が何をしてもすべてを破ります。 最初の試合の後で(そして、うまくいきませんでしたが)、 '\ '%C%m、' .'を追加しようとしました。 – iovis

+0

私が上に書いたように、あなたは 'errorformat'でそれを直接行うことはできません。エラーを前処理するか、または既知の迷惑メールを削除してその他すべてを含める必要があります。 –

+0

もっと便利な 'errorformat'を追加しました。確実な結果を得るには、おそらくJSON出力を使用し、 'syntaten'チェッカーを書いてください。 –