実験的にRailsの開発をしています。railstutorialをひと通りやったこともあってRSpecを使った画面遷移のテストを書いたりもしてみています。
railstutorialをやりながら思ったのはテストおせえええってことです。なのでSporkを使います。
Sporkを使うとテストサーバーみたいなのが立ち上がってテストの実行がめちゃくちゃ早くなります。雰囲気5倍から10倍ぐらい。
でも、テスト書き換えたりロジック書き換えたりしたらSporkの再起動が必要だったりします。それじゃあいくらテストが早くても意味ないですよね。(もしかしたら設定が悪かっただけかも…?)
そこでGuardを使います。Guardではファイルの変更を監視していて、変更があったファイルのテストだけをしてくれます。Sporkのときと同じぐらい早いですし、変更分だけテストが走るのでさらに楽です。RSpecでもオプションで選べますけどね。。。
そういったもろもろの設定はこちらから丸々いただきました。
RSpec, Capybara, factory_girl, Spork, GuardでGrowlなRailsテスト環境を作る - Qiita [キータ]
[http://qiita.com/bojovs/items/6c6e00691be247e6fcd2:image:large]
Growlなんかも使ったりして、通知が来て便利です。最近Growl有料化したんだよね…
Javascriptを使ったテストを除外する
やっと本題です。HTMLのformを使わずにPOSTする、みたいなことをJavascriptを使って実現しているのですが、テストに使っているCapybaraではそういったテストは普通はできません。なので、:js => true なるオプションをつけてJavascriptのことも考えてテストしてねと教えてあげるわけです。
そうするとブラウザ(デフォルトではFirefox)が立ち上がって、操作したまんまをテストしてくれます。そしてその分遅い。
Guardが監視してくれてるおかげでテストが捗るのはいいんですが、jsのテストを含むファイルを頻繁に編集→保存するたびに立ち上がるFirefoxはとても邪魔です。Guard落とそうかと思うぐらいです。
と思ったらjsのテストを除外する方法がありました。
$ rspec -t ‘~js’
だけどこれだとSpork使ったとき(つまり通常の運用中)には有効にならないっぽいんです。
困りましたが、なんとかしました。
先ほどのQiitaの記事でGuardfileなるものを作ったと思います。そこにRSpecに渡している –drbオプションがありました。そこにjsを除外するオプションもつけてしまえ!と変更したらまんまとうまくいきました。
# ここを
guard 'rspec', :version => 2, :cli => "--drb", :all_after_pass => false, :all_on_start => false do
# こうした
guard 'rspec', :version => 2, :cli => "--drb -t '~js'", :all_after_pass => false, :all_on_start => false do
これでGuard監視による自動テストではjs無視、手動テストではjsもテストという環境ができました。