Hack #172: RSpecをquickrunする (1/2):
Posted at 2010/09/07ツイート
 
問題
Rubyでプログラムを書くときは必ずRSpecでその仕様を記述することが推奨されています。VimからRSpecを呼び出す方法は多々あり、一般に使われている方法は以下のいずれかでしょう。
- Vim Rspecを使う
- Specky!を使う
- :!rspec %する
- Rakefileにテストスイートを記述し、- :!rakeあるいは- :makeで- rakeコマンドを走らせる
- :shellまたはvimshellから- rspecコマンドを直接走らせる
- Vimの外から自動でRSpecを走らせる (一定時間間隔なり、ファイルが変更された時点なり)
しかしながら、いずれの方法も問題を抱えています。
- Vim Rspecを使う
- 依存ライブラリが多い。特にHpricotなど、今では誰も使用していないライブラリに依存してしまっている
- 実行結果を見るときにVimで他の処理ができない
- Rspecなど存在しない。RSpecが正しい
 
- Specky!を使う
- RSpecしたいだけの者には無駄な機能が多すぎる。特にsnippet
- RSpecの結果の失敗をquickfixとして使っているという設計上のミス (*1)
 
- :!rspec %する- 実行結果を見るときにVimで他の処理ができない
 
- Rakefileにテストスイートを記述し、- :!rakeあるいは- :makeで- rakeコマンドを走らせる- 実行結果を見るときにVimで他の処理ができない
 
- :shellまたはvimshellから- rspecコマンドを直接走らせる- :shellの場合、実行結果を見るときにVimで他の処理ができない
- 汎用的すぎる
- :shellに入る/抜ける処理が必要
 
- Vimの外から自動でRSpecを走らせる (一定時間間隔なり、ファイルが変更された時点なり)
- 実行結果をVimから閲覧するのが容易でない
 
(*1): RSpecにおけるFailureと、一般的なプログラミングにおけるコンパイルエラーは全く別もの。コンパイルエラーは望まない結果だが、RSpecではまずFailureが出力されるよう開発するもので、例外的なものではない。異なる概念を同一視している。(←あくまで著者の個人的意見です)
解決法
常日頃使っている汎用プラグインquickrunを使います。~/.vimrcに以下の設定を記述します。
let g:quickrun_config['ruby.rspec'] = {'command': 'spec'}

ただし、_spec.rbなファイルをruby.rspecという複合ファイルタイプにするために以下の設定も~/.vimrcに記述します。
augroup UjihisaRSpec
  autocmd!
  autocmd BufWinEnter,BufNewFile *_spec.rb set filetype=ruby.rspec
augroup END
また、他のquickrunの設定をお持ちでない場合、以下の行を先ほどの行よりも手前に記述しておきます。
let g:quickrun_config = {}
補足
quickrunとvimshellを組み合わせると、環境変数$PATHを容易に変更できるため、どのspecコマンドを用いるか容易に変更することができます。
				また一般にspecコマンドの実行には時間がかかりますが、quickrunは非同期で実行できるため、気になりません。
参考
ujihisaもどる
blog comments powered by Disqus