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ステージを「通過」するにはどうすればよいですか?
私はあなたがGemfileでそのようなファクトリーガールの定義を持っている必要があると思います:
gem 'factory_girl_Rails', :require => false
そして、次のようにspec_helper.rbでそれを必要とします。
require 'factory_girl_Rails'
これは私がいつもこの宝石を使っている方法です。 spec_helper.rb以外の場所でそれを要求する必要はありません。あなたの現在の望ましいアプローチはちょうど間違っています。
この問題の簡単な修正は、モデルをブロックでラップすることにより、工場内のモデルの評価を遅らせることです。したがって、これの代わりに:
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
工場がたくさんある場合、これは実現可能ではないかもしれませんが、それはかなり簡単です。 ここ も参照してください。
からの情報: 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.
あなたはそれをする必要はないはずです..問題は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