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

fixtures のグループを作ることができる fixture_group という gem を作った

github.com

Rails には fixtures というテストデータを管理する機能が標準であります。今回作った fixture_group はその fixtures の拡張で、名前の通り、fixtures のグループを作ってグループ単位で fixtures をロードしたりできるようになるライブラリです。

使い方

README.md の説明そのままですが、例えば次のような感じで使うことができます。

fixtures グループの構成:

Rails.root/
  |- app/
  |- config/
  |    :
  `- test/
    |- unit/
    |    :
    `- fixtures/
      |- group_a/
      |  |- users.yml
      |  `- items.yml
      `- group_b/
         |- subgroup_b1/
         |  |- users.yml
         |  `- items.yml
         `- subgroup_b2/
            |- users.yml
            `- items.yml

テストコードで fixtures をロードする:

class FooTest < ActiveSupport::TestCase
  fixture_group 'group_a', :all

  def test_index
    # :
    assert_equal users(:user_a), @user
  end
end

class HogeIntegrationTest < ActionDispatch::IntegrationTest
  fixture_group 'group_b/subgroup_b1', :users, :items
  # :
end

README でもこの程度しか説明していないので、詳しい使い方は下記テストコードを見てください。ちなみに、関連とか ERB など、通常の fixtures の機能も普通に使えると思います。

fixture_group/test at master · hidakatsuya/fixture_group · GitHub

インストール

Gemfile に下記の行を追記:

gem 'fixture_group', group: :test, require: false

インストール:

$ bundle

test_helper.rb などで読み込む:

require 'fixture_group'

既知の問題点

通常、fixtures は test/fixtures のようなディレクトリ内にテーブルごとの yml ファイルを作成すると思います。その場合、実テーブルとそれに対応する yml ファイルは 1:1 なので、fixtures 標準では一度ロードしたテーブルデータはキャッシュされる仕組みになっています。

しかし、fixture_group を使う場合、実テーブルと yml ファイルが 1:1 にならないため、強制的に標準のキャッシュ機能を off にする必要がありました。厳密には、キャッシュさせないようにしてるのではなく、 このコード でやってるように、キャッシュされてるかどうかの問い合わせに対して常に No と返事する*1ようにモンキーパッチしています

ベンチマークしてないのでどの程度かわかりませんが、fixture_group を使わない場合に比べるとほぼ間違いなく遅くなると思います。良い方法は全く思いつかないですが、解決できるといいなぁと思ってはいます。

*1:fixture_group 管理外の yml は除く