web-dev-qa-db-ja.com

FactoryGirlはrakedb:migrateプロセスを台無しにします

Ruby on Rails 3 with Rspec(2.11.0)and FactoryGirl(4.0.0)でTDD/BDDを実行しています)。カテゴリモデル:

_FactoryGirl.define "Category" do
  factory :category do
    name "Foo"
  end
end
_

ドロップして、データベースを作成してからtest環境に移行すると、次のエラーが発生します。

_rake aborted!
Could not find table 'categories'
_

この問題は、FactoryGirlがテーブルがすでに存在することを想定しているために発生します(何らかの奇妙な理由で)。 Railsアプリからspecフォルダーを削除して_db:migrate_を実行すると、機能します。また、Gemfileから_factory-girl-Rails_を_:require => false_それも機能します(rspecを実行するために必要なコメントが必要です)。

私はここでこの問題に関するいくつかの情報を見つけました: https://github.com/thoughtbot/factory_girl/issues/88

私がしている何か問題がありますか? _db:migration_タスクのFactoryGirlステージを「通過」するにはどうすればよいですか?

31
Ilea Cristian

私はあなたがGemfileでそのようなファクトリーガールの定義を持っている必要があると思います:

  gem 'factory_girl_Rails', :require => false

そして、次のようにspec_helper.rbでそれを必要とします。

  require 'factory_girl_Rails'

これは私がいつもこの宝石を使っている方法です。 spec_helper.rb以外の場所でそれを要求する必要はありません。あなたの現在の望ましいアプローチはちょうど間違っています。

73
Vadim Chumel

この問題の簡単な修正は、モデルをブロックでラップすることにより、工場内のモデルの評価を遅らせることです。したがって、これの代わりに:

factory :cake do
  name "Delicious Cake"
  frosting Frosting.new(:flavor => 'chocolate')
  filling Filling.new(:flavor => 'red velvet')
end

これを行います(中括弧に注意してください):

factory :cake do
  name "Delicious Cake in a box"
  frosting { Frosting.new(:flavor => 'chocolate') }
  filling { Filling.new(:flavor => 'red velvet') }
end

工場がたくさんある場合、これは実現可能ではないかもしれませんが、それはかなり簡単です。 ここ も参照してください。

12
polm23

からの情報: http://guides.rubyonrails.org/testing.html

テストデータベースを破壊することになった場合(そしてそれは起こります、私を信じてください)、開発データベースで定義された仕様に従って最初から再構築することができます。これを行うには、rake db:test:prepareを実行します。

上記のrake db:migrateは、開発環境で保留中の移行を実行し、db/schema.rbを更新します。 rake db:test:loadは、現在のdb/schema.rbからテストデータベースを再作成します。その後の試行では、最初にdb:test:prepareを実行することをお勧めします。これは、保留中の移行を最初にチェックし、適切に警告するためです。

rake db:test:clone            Recreate the test database from the current environment’s database schema
rake db:test:clone_structure  Recreate the test database from the development structure
rake db:test:load             Recreate the test database from the current schema.rb
rake db:test:prepare          Check for pending migrations and load the test schema
rake db:test:purge            Empty the test database.
3
Ilea Cristian

あなたはそれをする必要はないはずです..問題はFactoryGirl.defineへのあなたの議論だと思います。

これを試して。

FactoryGirl.define do
   factory :category do
       name "Foo"
   end
end

これは正常に機能するはずであり、移行やロードを台無しにすることはありません。今日、工場からモデル定数を直接参照していた問題を修正し、問題を修正するためにブロックに入れる必要がありました。

FactoryGirl.define do
   factory :category do
       # this causes unknown table isseus
       # state Category::Active
       # this does not.
       state { Category::Active }
   end
end
1
Urkle