vim-users.jp

Hack #172: RSpecをquickrunする (1/2):

Posted at 2010/09/07
このエントリーをはてなブックマークに追加

問題

Rubyでプログラムを書くときは必ずRSpecでその仕様を記述することが推奨されています。VimからRSpecを呼び出す方法は多々あり、一般に使われている方法は以下のいずれかでしょう。

  • Vim Rspecを使う
  • Specky!を使う
  • :!rspec %する
  • Rakefileにテストスイートを記述し、:!rakeあるいは:makerakeコマンドを走らせる
  • :shellまたはvimshellからrspecコマンドを直接走らせる
  • Vimの外から自動でRSpecを走らせる (一定時間間隔なり、ファイルが変更された時点なり)

しかしながら、いずれの方法も問題を抱えています。

  • Vim Rspecを使う
    • 依存ライブラリが多い。特にHpricotなど、今では誰も使用していないライブラリに依存してしまっている
    • 実行結果を見るときにVimで他の処理ができない
    • Rspecなど存在しない。RSpecが正しい
  • Specky!を使う
    • RSpecしたいだけの者には無駄な機能が多すぎる。特にsnippet
    • RSpecの結果の失敗をquickfixとして使っているという設計上のミス (*1)
  • :!rspec %する
    • 実行結果を見るときにVimで他の処理ができない
  • Rakefileにテストスイートを記述し、:!rakeあるいは:makerakeコマンドを走らせる
    • 実行結果を見るときに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'}

image

ただし、_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は非同期で実行できるため、気になりません。

参考

Hack #176: RSpecをquickrunする (2/2)

ujihisa

もどる
blog comments powered by Disqus