Jun's Blog

Output, activities, memo and etc.

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