A smart way of testing inside Vim
September 19, 2016
Most of my developing time I pass on the test suite. More than that, I spend the majority of time in a specific test file or even a single test function. Given that, any effort made to simplify this process is a good one. In this mood I’ll present my method of testing while developing inside Vim.
The following function wraps PHPunit’s and allows me to run tests from inside vim and other goodies that I’ll describe below.
function! RunPHPUnitTest(filter) cd %:p:h if a:filter normal! T yw if @" =~ "^test*" normal! mT endif normal! `T normal! T yw " let myCommand="phpunit -c ". $PWD ."/Backend/phpunit.xml.dist \ --filter " . @" . " " . expand("%:p") let result = system(myCommand) else let @n = expand('%:t') if @n =~ "Test" normal! mA endif normal! `A let myCommand = "phpunit -c ". $PWD . "/Backend/phpunit.xml.dist \ " . expand("%:p") let result = system(myCommand) endif split __PHPUnit_Result__ normal! ggdG setlocal buftype=nofile call append(0, myCommand) call append(0, split(result, '\v\n')) cd - endfunction
With the following maps:
nnoremap <leader>u :call RunPHPUnitTest(0)<cr> nnoremap <leader>f :call RunPHPUnitTest(1)<cr>
Now when I press
<leader>u it runs the current file tests and prints the
result in a new split. And when I press
<leader>f while over a test name
it runs the test and opens the same split on the current window.
Even better, once I played a test it keeps a mark of which one I
had run, so I don’t have to be on the function or on the file to run
it again, simply
<leader>(u|f) to get the same result.
To be honest, the original function is not a creation of mine. I found it on the internet. But the mark thing is mine, so if It’s useful for you as well let me know :).