FactoryGirl screws up Rake db:migrate process

Robię TDD / BDD w Ruby on Rails 3 z Rspec (2.11.0) i FactoryGirl (4.0.0). Mam fabrykę dla modelu kategorii:

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

Jeśli upuszczę, Utwórz następnie migruj bazę danych w test środowisko dostaję ten błąd:

rake aborted!
Could not find table 'categories'

Ten problem występuje, ponieważ FactoryGirl oczekuje, że tabele już istnieją (z jakiegoś dziwnego powodu). Jeśli usunę folder spec z mojej aplikacji rails i wykonam db:migrate, to zadziała. Również jeśli zaznaczę factory-girl-rails z mojego Gemfile jako :require => false to również działa (wtedy Muszę skomentować, że wymagane w celu uruchomienia rspec).

Znalazłem kilka informacji o tym problemie tutaj: https://github.com/thoughtbot/factory_girl/issues/88

Czy coś jest nie tak, że robię? Jak "przejść" etap Faktorygirl w zadaniu db:migration?
Author: Ilea Cristian, 2012-09-14

4 answers

Myślę, że trzeba mieć taką definicję factory girl w Gemfile:

  gem 'factory_girl_rails', :require => false

A potem po prostu potrzebujesz go w swoim spec_helper.RB jak to:

  require 'factory_girl_rails'
W ten sposób zawsze używam tego klejnotu. Nie musisz tego wymagać w innych miejscach niż spec_helper.rb. Twoje obecne pożądane podejście jest po prostu złe.
 73
Author: Vadim Chumel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-19 08:59:50

Prostą poprawką tego problemu jest opóźnienie oceny dowolnych modeli w fabrykach poprzez owinięcie ich w bloki. Więc zamiast tego:

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

Zrób to (zwróć uwagę na kręcone szelki):

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

Jeśli masz wiele fabryk, może to nie być wykonalne, ale jest to raczej proste. Zobacz też tutaj .

 12
Author: polm23,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-10 08:28:22

Informacje z: http://guides.rubyonrails.org/testing.html

Kiedy skończysz niszcząc swoją bazę testową (i to się stanie, zaufaj mi), możesz go odbudować od podstaw zgodnie ze specyfikacjami zdefiniowanymi w projekcie baza danych. Możesz to zrobić uruchamiając rake db:test:prepare.

rake db:migrate powyżej uruchamia wszelkie oczekujące migracje w środowisku deweloperskim i aktualizacje db/schema.rb. rake db:test:load odtwarza testową bazę danych z current db/schema.rb. Przy kolejnych próbach, to dobrym pomysłem jest najpierw uruchomienie db:test:prepare, ponieważ najpierw sprawdza oczekujące migracje i odpowiednio ostrzega.

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
Author: Ilea Cristian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-14 13:39:37

Nie powinieneś tego robić.. Myślę, że problem polega na tym, że twój argument do FactoryGirl.zdefiniuj..

Spróbuj tego.
FactoryGirl.define do
   factory :category do
       name "Foo"
   end
end

To powinno działać dobrze, i nie psuje moich migracji lub obciążenia.. Dzisiaj musiałem naprawić problem, w którym odnosiłem się bezpośrednio do stałej modelu z mojej fabryki i musiałem umieścić ją w bloku, aby naprawić rzeczy.

FactoryGirl.define do
   factory :category do
       # this causes unknown table isseus
       # state Category::Active
       # this does not.
       state { Category::Active }
   end
end
 1
Author: Urkle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-11 22:29:48