概要
テストクラス毎にfixureを分けたい。
詳細
Minitestではテストデータをfixtureフォルダにyaml形式のファイルで配置しておかなければならない。yamlファイル名はモデル名であり、アプリケーション全体で1モデル=1fixutureファイルが基本である。
しかし、アプリケーションが複雑になってくると1モデル=1ファイルですべてのテストケースを網羅するようなテストデータを用意するのが難しくなることがある。そこでテストクラス毎にfixureファイルを分けることでテストケースを網羅するテストデータを用意し易くする。
対応
アプリケーション全体で1モデル=1ファイルを一度に読み込むようになっているのを止める。
それぞれのテストクラスで任意のfixtureを読み込むようにする。
サンプルコード
サンプルでは2つのテストクラス book_test.rb と user_test.rb があり、それぞれのテストクラスでBookモデルのテストデータを別々のfixtureから読み込む。
アプリケーション全体で1モデル=1ファイルを一度に読み込むようになっているのを止める。
通常はtest/fixuresフォルダ以下のfixureファイルを読み込む。
ENV['RAILS_ENV'] ||= 'test'
require_relative '../config/environment'
require 'rails/test_help'
class ActiveSupport::TestCase
# ここでfixtureを一度に読み込むようになっているのでコメントアウトする
# fixtures :all
end
このテストクラスでは test/fixtures/book_test フォルダにある books.yaml をBookモデルに読み込むようにする。
require 'test_helper'
class BookTest < ActiveSupport::TestCase
fixture_directory = Rails.root.join("test", "fixtures", "book_test")
fixture_files = [:books]
fixture_models = {:book => Book}
ActiveRecord::FixtureSet.create_fixtures(fixture_directory, fixture_files, fixture_models, ActiveRecord::Base)
test "テスト" do
# テストコード
end
end
こちらのテストクラスでは test/fixtures/user_test フォルダにある books.yaml をBookモデルに読み込むようにする。このサンプルでは別のモデルであるUserのfixureも読み込んでいる。
require 'test_helper'
class UserTest < ActiveSupport::TestCase
fixture_directory = Rails.root.join("test", "fixtures", "user_test")
fixture_files = [:books, :users]
fixture_models = {:book => Book, :user => User}
ActiveRecord::FixtureSet.create_fixtures(fixture_directory, fixture_files, fixture_models, ActiveRecord::Base)
test "テスト" do
# テストコード
end
end