Как запустить тесты интеграции 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(или создайте новый, который вы укажете в тестовых файлах интеграции)