Зачем мне нужно перенести тестовую базу данных в Rails?

После создания нового файла миграции, выполняющего миграцию, затем выполните мои тесты, которые я получаю:

Failure/Error: ActiveRecord::Migration.maintain_test_schema!

ActiveRecord::PendingMigrationError:

  Migrations are pending. To resolve this issue, run:

          bin/rails db:migrate RAILS_ENV=test

Не соответствует ли следующий фрагмент в rails_helper.rb для переноса миграции в тестовую базу данных для меня?

# Checks for pending migration and applies them before tests are run.
# If you are not using ActiveRecord, you can remove this line.
ActiveRecord::Migration.maintain_test_schema!

Обновление

Вот мой config/environments/test.rb по запросу:

Rails.application.configure do
  # Settings specified here will take precedence over those in config/application.rb.

  # The test environment is used exclusively to run your application's
  # test suite. You never need to work with it otherwise. Remember that
  # your test database is "scratch space" for the test suite and is wiped
  # and recreated between test runs. Don't rely on the data there!
  config.cache_classes = true

  # Do not eager load code on boot. This avoids loading your whole application
  # just for the purpose of running a single test. If you are using a tool that
  # preloads Rails for running tests, you may have to set it to true.
  config.eager_load = false

  # Configure public file server for tests with Cache-Control for performance.
  config.public_file_server.enabled = true
  config.public_file_server.headers = {
    'Cache-Control' => 'public, max-age=3600'
  }

  # Show full error reports and disable caching.
  config.consider_all_requests_local       = true
  config.action_controller.perform_caching = false

  # Raise exceptions instead of rendering exception templates.
  config.action_dispatch.show_exceptions = false

  # Disable request forgery protection in test environment.
  config.action_controller.allow_forgery_protection = false
  config.action_mailer.perform_caching = false

  # Tell Action Mailer not to deliver emails to the real world.
  # The :test delivery method accumulates sent emails in the
  # ActionMailer::Base.deliveries array.
  config.action_mailer.delivery_method = :test

  # Print deprecation notices to the stderr.
  config.active_support.deprecation = :stderr

  # Raises error for missing translations
  # config.action_view.raise_on_missing_translations = true
end

Ответ 1

При запуске ваших тестов конфигурации загружаются в следующем порядке (если вы не настроили порядок autoload_paths в своем приложении rails):

  1. config/application.rb
  2. конфигурации/среда /test.rb
  3. спецификации /rails_helper.rb

Таким образом, ошибка ожидания миграции, которую вы получаете, должна быть вызвана config.active_record.migration_error = true этой настройкой конфигурации где-то ранее на нагрузках двигателя рельсов rails_helper.rb, где определена директива ActiveRecord::Migration.maintain_test_schema!.

Попробуйте установить config.active_record.migration_error = false в вашем config/environment/test.rb, чтобы пропустить проверку миграции, как описано в руководстве по обновлению rspec.

Ответ 2

Возможно, это связано с двумя причинами.

  • Возможно, вы пропустили его для настройки в config/environments/test.rb

Добавьте config.active_record.maintain_test_schema = true, если у вас его нет или установите его true, если вы установили его в false.

Из docs

config.active_record.maintain_test_schema - это логическое значение, которое контролирует, должна ли Active Record пытаться сохранить тестовую базу данных схема, обновленная с помощью db/schema.rb(или db/structure.sql) при запуске ваши тесты. Значение по умолчанию - true.

  1. У вас могут быть ожидающие миграции после загрузки схемы

Из rspec docs

Что это значит, а не просто повышать, когда тестовая схема имеет ожидающие миграции, Rails попытается загрузить схему. исключение теперь будет только повышаться, если ожидающие миграции после этого была загружена схема.

Проверьте, есть ли у вас ожидающие миграции с помощью rake db:migrate:status

Кроме того, если вы используете SQLite 3.7.9, вы должны посмотреть на это обсуждение

Ответ 3

Вы должны запустить rails db:migrate RAILS_ENV=test, чтобы сначала обновить тестовую базу данных.

Что это значит, так что вместо того, чтобы просто поднимать, когда тестовая схема ожидает ожидающих миграции, Rails попытается загрузить схему. Исключение будет теперь повышаться только в том случае, если в ожидании миграции произошла загрузка схемы.

Есть несколько предостережений, которые следует учитывать при использовании этого:

  • Миграции по-прежнему необходимо запускать вручную; хотя сейчас это нужно делать только в среде разработки.
  • Исключение будет вызвано, если схема не была инициализирована. Исключение предоставит инструкции, в которых указывается rake db:migrate.