Подтвердить что ты не робот

FactoryGirl закручивает rake db: процесс миграции

Я делаю TDD/BDD в Ruby on Rails 3 с Rspec (2.11.0) и FactoryGirl (4.0.0). У меня есть factory для модели категории:

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

Если я удалю, создайте, а затем перенесите базу данных в среду test. Я получаю эту ошибку:

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?

4b9b3361

Ответ 1

Я думаю, вам нужно иметь определение девушки factory, как в Gemfile:

  gem 'factory_girl_rails', :require => false

И тогда вы просто требуете его в свой spec_helper.rb следующим образом:

  require 'factory_girl_rails'

Так я всегда использую этот драгоценный камень. Вам не нужно требовать его в других местах, кроме spec_helper.rb. Ваш текущий желаемый подход просто неверен.

Ответ 2

Простым решением этой проблемы является отсрочка оценки любых моделей на ваших фабриках путем их упаковки в блоки. Итак, вместо этого:

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

Если у вас много фабрик, это может оказаться невыполнимым, но это довольно просто. См. Также здесь.

Ответ 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.

Ответ 4

Вам не нужно ничего делать. Я думаю, проблема в том, что ваш аргумент FactoryGirl.define..

попробуйте это.

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

Это должно работать нормально и не испортить мои миграции или загрузку. Сегодня мне пришлось исправить проблему, когда я ссылался на константу модели из моего factory напрямую и должен был поместить ее в блок для исправления вещи.

FactoryGirl.define do
   factory :category do
       # this causes unknown table isseus
       # state Category::Active
       # this does not.
       state { Category::Active }
   end
end