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
Другие вопросы по тегам