Миграции и Rspec
Я разрабатываю приложение Rails с Rspec для модульного тестирования.
недели назад Rspec автоматически переносил базу данных на последнюю версию при выполнении "Rake spec", но теперь он не делает этого автоматически, я должен реализовать все для себя.
Это происходит в тестовой среде, потому что мои данные разработки не знает.
- Это моя вина? Я ничего не менял, думаю:)
спасибо заранее.
6 ответов
обычно я использую команду псевдонима, которая выполняет как миграцию, так и подготовку тестовой базы данных.
rake db:migrate && rake db:test:prepare
в вашей .bashrc просто создайте команду псевдонима, а затем запустите migrate_databases всякий раз, когда вам нужно.
alias migrate_databases='rake db:migrate && rake db:test:prepare'
мое решение для Rails 4:
на spec/spec_helper.rb
или в любом месте кода инициализации среды тестирования:
# Automigrate if needs migration
if ActiveRecord::Migrator.needs_migration?
ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate'))
end
UPD: как любезно указал Дориан в комментариях, вам не нужно отдельно проверять, есть ли какие-либо ожидающие миграции, потому что ActiveRecord::Migrator.migrate
уже делает это за кадром. Таким образом, вы можете эффективно использовать только одну строку:
ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db/migrate'))
Rails 4.1 вперед вы можете использовать:
ActiveRecord::Migration.maintain_test_schema!
добавить вверху spec_helper.rb
или rails_helper.rb
и вы хорошо идти. подробнее здесь.
вот мое решение:
Rakefile:
require File.expand_path('../config/application', __FILE__)
require 'rake'
require "rspec/core/rake_task"
MyApp::Application.load_tasks
desc "Run specs"
RSpec::Core::RakeTask.new(:spec)
task :run_specs => ['db:test:clone', :spec] do
end
task :default => :run_specs
затем я запускаю $ rake run_specs
по какой-то причине задача по умолчанию не по умолчанию run_specs
посмотрите, есть ли у вас следующее в вашем spec_helper.РБ? Каждый раз, когда вы запускаете спецификации, RSpec проверяет наличие ожидающих миграций.
#Checks for pending migrations before tests are run.
#If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)
это работает, даже если Rails не загружается и большую часть времени выполняет только один SQL-запрос.
if defined?(ActiveRecord::Migrator)
ActiveRecord::Migrator.migrate(File.join(Rails.root, 'db', 'migrate'))
end