Vim で現在カーソルがあるテストメソッドを実行する

Perl には Test::Class という JUnit 風にテストを書けるモジュールがある。すなわち:

ことができる。

Test::Class はテスト実行時に環境変数 TEST_METHOD に与えられた値で実行するテストメソッドをフィルタリングすることができる。

Sometimes you just want to run a single test. Commenting out other tests or writing code to skip them can be a hassle, so you can specify the TEST_METHOD environment variable. The value is expected to be a valid regular expression and, if present, only runs test methods whose names match the regular expression.

Test::Class - search.cpan.org

テストコードが存在するソフトウェアに修正を加える場合、大抵、いつかのタイミングでテストコードを修正することになる。そうなるとまず修正したテストのみを実行し、最小限度のフィードバックを得たい。

つまり、TEST_METHOD を指定してテストを走らせたいのだが、いちいちテストメソッド名を入力するのも面倒である。

そこでテストの実行には vim-quickrun を、現在カーソルのあるメソッド名を取得するために current-func-info.vim を使う。

let g:quickrun_config['prove/carton'] = {
      \ 'exec'    : 'carton exec -- %c %o %s',
      \ 'command' : 'prove',
      \ }
let g:quickrun_config['prove/carton/contextual'] = extend(g:quickrun_config['prove/carton'], {
      \ 'exec' : 'TEST_METHOD=%a ' . g:quickrun_config['prove/carton'].exec,
      \ })
command! ProveThis call s:prove_this()
function! s:prove_this()
  let func_name = cfi#format('%s', '')
  if func_name == ''
    QuickRun prove/carton
  else
    execute 'QuickRun prove/carton/contextual -args ' . func_name
  endif
endfunction

メソッド名を得ることができればその値を引数として渡し prove/carton/contextual の設定を使って QuickRun を実行する。得られなければ prove/carton を実行する。