FactoryGirl испортил грабли DB: процесс миграции
Я делаю TDD/BDD в Ruby on Rails 3 с Rspec (2.11.0) и FactoryGirl (4.0.0). У меня есть фабрика для категории модели:
FactoryGirl.define "Category" do
factory :category do
name "Foo"
end
end
Если я отбрасываю, создаю, а затем перемещаю базу данных в тестовой среде, я получаю эту ошибку:
rake aborted!
Could not find table 'categories'
Эта проблема возникает из-за того, что FactoryGirl ожидает, что таблицы уже существуют (по какой-то странной причине). Если я удаляю папку spec из моего приложения rails и делаю db:migrate
, оно работает. Также, если я отмечу factory-girl-rails
от моего Gemfile
как :require => false
это также работает (тогда я должен прокомментировать, что требуется для запуска rspec).
Я нашел некоторую информацию об этой проблеме здесь: https://github.com/thoughtbot/factory_girl/issues/88
Что-то не так, что я делаю? Как я могу пройти мимо этапа FactoryGirl в db:migration
задача?
4 ответа
Я думаю, вам нужно иметь такое определение фабричной девушки в 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