読者です 読者をやめる 読者になる 読者になる

Rails2でのautotestの設定メモ

Rails RSpec

環境

  • Rails2
  • RSpec 1.3.2(vendor/pluginsにいれた)
  • RSpec-Rails 1.3.4(vendor/pluginsにいれた)
  • Rcov 0.9.11
  • ZenTest 4.0.0

特に新しいことをやってるわけでもなく、環境のバージョン自体は古いので新しい環境(特にRails3系の場合)を構築するのには
全く役に立たないのでまたそれは、構築の時に今回との差異を調べてすればいいかな


便利なことが実感できれば次回以降もなんとかして入れようと試みるわけで


RSpecが1系なのはRailsが2系な為ですが、ZenTestが古い理由はこのへんを見たのと、あと入れてみて動いたのでとりあえず4.0.0でっていう

設定等

実際にはscript/autospecで実行をしてる
これはautotestにRSpecを使うよ。とオプションを指定しているだけなので実際はautotestが実行されてる
autotestはZenTestに含まれてる


上記の環境入れてRails.rootでruby script/autospecを実行すれば後はファイルの変更があったら
自動的にspecを実行してくれる。とても便利


ちょっと、問題になったことがあって、あるカラムにユニークの制約をもたせているときに
FactoryGirlでデータを作っているとユニークチェックをパスできてなかった


rake specを実行すると通るので何だろうと思ったんだけど、autospecでspecを実行するときには
db:test:prepareが実行されていなくてテスト用DBが初期化されていないからカラムが残っていて制約にかかったよう

どうするの

autotestでは処理にフックしていろいろな処理を実行することができる


フックの種類に関しては下記サイトを参考にさせていただいた


テスト実行前にテストDBを初期化すればよさそうなので、フックの処理を~/.autotestに書く


.autotest

Autotest.add_hook :run_command do |at|
  system("rake db:test:prepare")
  next false
end


なお、.autotestのサンプルは$GEM_HOME/gems/ZenTest-*.*.*/example_dot_autotest.rbに置いてあると思うけど
結構いろんなプラグインがあっていろいろ対応しているみたい


試しにrcovを実行するような設定をしてみる

.autotestに追記

require 'autotest/rcov'
Autotest::RCov.command = 'spec:rcov'

RCov.commandを指定しないとrake rcovを実行するようだけど自分の環境ではそんなタスクなかったので
rake spec:rcovを実行するようにしてみた。テスト実行された後またテスト実行するのは少しアホだが
そのへんはrspec-railsに定義されてるspec:rcovとかをみながら.autotestに書けばいいのだろう
(毎度毎度rcovやってると重いので外しているのでやるかわかんないけど)