32

Rspec (2.11.0) と FactoryGirl (4.0.0) を使用して、Ruby on Rails 3 で TDD/BDD を実行しています。カテゴリ モデルのファクトリがあります。

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

テスト環境でデータベースを削除、作成、移行すると、次のエラーが発生します。

rake aborted!
Could not find table 'categories'

この問題は、FactoryGirl がテーブルが既に存在することを想定しているために発生します (奇妙な理由で)。rails アプリから spec フォルダーを削除して を実行するdb:migrateと、動作します。factory-girl-railsまた、my からマークするとGemfile:require => falseそれも機能します (rspec を実行するには、require とコメントする必要があります)。

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

私がやっていることは何か間違っていますか?タスクの FactoryGirl ステージを「通過」するにはどうすればよいdb:migrationですか?

4

4 に答える 4

79

Gemfile に次のようなファクトリー ガールの定義が必要だと思います。

  gem 'factory_girl_rails', :require => false

そして、次のように spec_helper.rb でそれを必要とするだけです:

  require 'factory_girl_rails'

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

于 2012-09-14T13:37:09.603 に答える
12
于 2012-12-10T08:28:22.723 に答える
3

情報: 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.
于 2012-09-14T13:39:37.937 に答える
1

あなたはそれをする必要はありません..問題は、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
于 2013-02-11T22:29:48.577 に答える