Как запустить тесты интеграции Rails без сброса содержимого БД?

Я написал некоторые интеграционные тесты, которые я бы хотел запустить против копии моей базы данных prod, прежде чем я начну работать. Это позволяет мне проверить, что все мои маршруты по-прежнему верны, все страницы отображаются без ошибок, а некоторые из многостраничных рабочих процессов работают должным образом.

Когда я запускаю интеграционные тесты, он упаковывает базу данных, которую я загрузил, и загружает тестовые приборы (как и ожидалось). Как я могу изменить это поведение и сохранить копию моей производственной БД, которую я загрузил?

Ответ 1

Интеграционные тесты называет db: test: prepare, который вызывает db: test: clone_structure, который вызывает db: structure: dump и db: test: purge

Вы можете написать свою собственную задачу

namespace :your_namespace do
  Rake::TestTask.new(:integration => "db:migrate(if you want") do |t|
    t.libs << "test"
    t.pattern = 'test/integration/**/*_test.rb'
    t.verbose = true
  end
end

Ответ 2

Чтобы заставить это работать, мне пришлось указать среду при вызове задачи rake, иначе она выполнила бы миграцию в db разработки и затем выполнила тесты на тестовом db; с учетом приведенного выше примера

namespace :dbtest do
  Rake::TestTask.new(:integration => "db:migrate") do |t|
    ...

Мне пришлось выполнить тесты так:

rake environment RAILS_ENV=test dbtest:integration

Ответ 3

Настройка self.use_transactional_fixtures = true в ваших тестах интеграции также полезна, если вы не хотите перезагружать производственную копию между каждым исполнением теста.

В противном случае, тестовый запуск интеграции будет распределять данные с любыми изменениями.

Ответ 4

Мне нужно было добавить задачу aivarsak Rake

namespace :dbtest do  
  Rake::TestTask.new(:integration) do |t|
    t.libs << "test"
    t.pattern = 'test/integration/**/*_test.rb'
    t.verbose = true  
  end
end

а также удалите

fixtures :all

из файла test/test_helper.rb(или создайте новый, который вы укажете в тестовых файлах интеграции)