rails 初期データとテストデータを一箇所で定義する

今回は、railsの初期データとテストデータを一箇所で定義する方法について調べてみた。

 

 

私今まで、初期データは、migration機能だけで作成していた。

 

>rails new SampleApp

SampleApp>cd SampleApp

SampleApp>rails generate model GolfClubType name:string
invoke active_record
create db/migrate/20121126144314_create_golf_club_types.rb
create app/models/golf_club_type.rb
invoke test_unit
create test/unit/golf_club_type_test.rb
create test/fixtures/golf_club_types.yml

SampleApp>rails generate migration AddDataToGol
fClubType
invoke active_record
create db/migrate/20121126144515_add_data_to_golf_club_type.rb

 

データ追加用のmigrationのファイルを作成して、データを追加していく。

 

では、単体テストをするときは?

GolfColubTypeモデルを作成した際に、自動的に作成される「test/fixtures/golf_club_types.yml」フィクスチャに別途定義する。

 

 

GolfClubTypeテーブルのデータは、migrationのファイルとfixturesのファイルの両方で定義していたことになる。

嫌だ。

 

そんな時は、test/fixtures以下のデータを、developmentやproduction環境のデータ作成のために使用することができる。

 

というわけで20121126144515_add_data_to_golf_club_type.rbはやはり不要なので削除する。

SampleApp>erase db\migrate\20121126144515_add_data_to_golf_club_type.rb

 

まずはスキーマ構造のみmigrateする。

SampleApp>rake db:migrate
== CreateGolfClubTypes: migrating ============================================
— create_table(:golf_club_types)
-> 0.0050s
== CreateGolfClubTypes: migrated (0.0120s) ===================================

 

この時点では、golf_club_typesテーブルのレコードは0件だ。

SampleApp>rails c
Loading development environment (Rails 3.2.9)
irb(main):001:0> GolfClubType.all.length

=> 0
irb(main):002:0> quit

 

続いてtest/fixtures/golf_club_types.ymlで定義したデータをdevelopment環境(またはproduction環境)のデータベースにロードする。

SampleApp>rake db:fixtures:load

SampleApp>rails c
Loading development environment (Rails 3.2.9)
irb(main):001:0> GolfClubType.all.length

=> 4

 

これで、開発環境、テスト環境、本番環境用のデータ定義を、1箇所で定義できるようになった。が、これが本当に模範解答か?は自信が無かったりする。。

 

ちなみに、テスト用のデータベースの作成は、こう。

SampleApp>rake db:test:prepare

 

参考になったページ:How To Use Fixtures to Populate Your Database in Rails

コメントを残す

トラックバック: http://pgnote.net/wp-trackback.php?p=931