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