Миграции и 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