Rspec: load specified table data for each unit test
問題の現象
RSepcでテストしていますが、同じテーブルのデータをテスト毎に呼びたいのです。
例えば下記のような有りがちな例の場合、
blogs id name entries id blog_id name article
Aという機能を作りました。
(a) entries を select * from entries の結果が6件というテストを書きます。
Bという機能を作りました。
entriesにテストデータの追加が必要になりました。
この時点で(a)のテストは6件ではなくなるので、修正が必要です。
例は簡単だからまだ良いですけど、実際はかなり面倒…。
これが解決できればテストの工数が結構減りそうですね。
解決策
以下の解決策があると思います。
- entries.yml を entreis_a.yml, entries_b.yml と分けてロードしたい。
こんな方法があるようです。
ぺんちゃん日記 テストデータを分割したい
http://www.pen-chan.jp/pen-chan/20080124.html
describe Page, 'がページを巡回するとき' do set_fixture_class :page_test1 => Page fixtures :page_test1 describe Page, 'がページを更新するとき' do set_fixture_class :page_test2 => Page fixtures :page_test2
# 追記
上記方法はRails2.1ではうまくいかないことを確認
- テスト毎に entries.yml の 指定された ラベルのデータだけロードしたい。
こっちの方がスマートっぽいけど、うまくできないかな…。
あ!!
各テストの前に不要なデータを削除すれば良いじゃん…。
下記なら、(b)をやる直前に、こんな感じで処理。
describe "テストBの場合" do fixtures entries Entry.delete_all({:conditions => [id < ?], 2000}) it "XXXとなること" do end end
# entries.yml test_a_001: id: 1001 blog_id: 1 name: abc test_a_002: id: 1001 blog_id: 2 name: abc test_b_001: id: 2001 blog_id: 1 name: abc test_b_002: id: 2002 blog_id: 2 name: abc