我将makeprg
设置为PHPUnit
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%.%#
仅使用||
打印行。我该怎么调试呢?我觉得我在黑暗中抨击。
答案 0 :(得分:2)
您尝试的主要问题是错误与您期望的错误不匹配。它实际上是这样的:读取错误行,然后它与errorformat
中的规则相匹配;匹配的第一条规则获胜。然后读取另一个错误行,并再次根据errorformat
中的规则进行匹配。等等。像%>
这样的东西会影响规则的尝试顺序,并且对从一个规则传递信息到另一个规则的支持有限,但基本上,如果你不能通过匹配将错误行与其他规则区分开来,你不能将它分配给给定的字段。
特别是,如果您无法将行Failed asserting that 1 matches expected 2.
与Time: 177 ms, Memory: 12.50MB
,F
和Tests: 1, Assertions: 1, Failures: 1.
区分开来,则不能将其包含在错误中信息。要解决这个问题,您可能需要按照syntastic的方式“预处理”错误,以便在同一行上获取1) dummy_test::testController
和Failed 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:
等来改进这一点,然后将剩余的行吞噬到错误消息中。尽管如此,你仍然可以处理空行。祝你好运。 :)
编辑:我更改了errorformat
以删除已知的固定模式。你可能需要多做一些,结果仍然是脆弱的。