如何在生产代码中使用vim命令运行正确的phpunit测试文件

时间:2015-03-11 09:37:22

标签: vim

我现在已经映射了一个快捷方式,因此我可以运行当前测试文件的php。当我开发时,我将窗口分成两部分:一方面我继续测试,另一方面我保留生产代码。如果我在测试文件上,感谢

:map <leader>t :!vendor/bin/phpunit %<cr>

我可以运行当前的phpunit测试。 %代表当前文件。我希望能够运行测试文件,当我使用生产代码时也是如此。例如:

 - src/Foo/Bar/ProductionCode.php
 - test/Foo/Bar/ProductionCodeTest.php

我可以映射

<leader>t

这样我才能从ProdutionCode.php开始测试?我每次都需要做的是Ctrl+w Ctrl+w <leader>t。我只想运行<leader>t命令。有人能帮助我吗?

测试的命名空间反映了生产的命名空间。我认为一个好主意可能就像

:map <leader>t :!vendor/bin/phpunit TESTFILE<cr>

其中TESTFILE就像这个伪代码:

if current file ends with Test.php
    return %
else
    fileName = % " src/Foo/Bar/ProductionCode.php
                 " src/Foo/Bar/ProductionCodeTest.php
                 " test/Foo/Bar/ProductionCodeTest.php
    return fileName
endif

有可能吗?

function! RunPhpUnit()
    let l:filename = expand('%')
    if l:filename !~# 'Test\.php$'
        let l:filename=substitute(l:filename, '\.php$', 'Test.php', '')
    endif
    let l:filename=substitute(l:filename, 'code\/classes', 'spec\/unit', '')
    return ':!vendor/bin/phpunit ' . l:filename . "\<CR>"
endfunction
:noremap <expr> <leader>t RunPhpUnit()

1 个答案:

答案 0 :(得分:2)

是的,这可以做到。对于文件名中的简单替换,您可以使用:help filename-modifiers下列出的修饰符,例如将src转换为test

:noremap <leader>t :!vendor/bin/phpunit %:s?src?test?<cr>

对于更复杂的逻辑(似乎你需要它),你可以使用:help :map-expression然后使用条件来按下文件名:

function! RunPhpUnit()
    let l:filename = expand('%')
    if l:filename !~# 'Test\.php$'
        call substitute(l:filename, '\.php$', 'Test.php', '')
    endif
    call substitute(l:filename, 'src', 'test', '')
    return ':!vendor/bin/phpunit ' . l:filename . "\<CR>"
endfunction
:noremap <expr> <leader>t RunPhpUnit()

PS:You should use :noremap;它使映射不受重映射和递归的影响。