После серьезного устранения неполадок я понял, что мне нужно запустить rake spec
один раз (я могу прервать работу с помощью control-c), прежде чем я смогу запустить rspec напрямую (например, на подмножестве наших спецификаций). Мы используем Rails 3.0.7 и RSpec 2.5.0.
Очевидно, что rake выполняет некоторые важные задачи / код настройки базы данных (у нас есть собственный код в Rakefile корневого уровня и, возможно, в других местах).
Как я могу запустить задачи / код настройки базы данных rake test без запуска rake spec
?
Помимо возможности запускать rspec для подмножества файлов, я использую specjour для распространения наших спецификаций по нескольким ядрам (пока не удалось распространить их по локальной сети), но я вижу то же поведение, что и при запуске rspec напрямую: мне нужно запустить rake spec
каждую тестовую базу данных (при условии двух ядер), прежде чем specjour заработает:
rake spec TEST_ENV_NUMBER=1
control-c (after tests start)
rake spec TEST_ENV_NUMBER=2
control-c (after tests start)
specjour
Примечание: в моем config / database.yml есть эта запись для тестирования (как это обычно бывает для гемов параллельного тестирования):
test:
adapter: postgresql
encoding: unicode
database: test<%=ENV['TEST_ENV_NUMBER']%>
username: user
password:
Кажется, что parallel_tests правильно настраивает свои базы данных, но многие из наших спецификаций не работают.
Я также должен упомянуть, что бег specjour prepare
заставляет Postgres регистрировать ошибки, что он не может найти базы данных, но создает их (без таблиц). При последующем запуске ошибки не регистрируются, но и таблицы не создаются. Возможно, вся моя проблема - это просто ошибка prepare
, поэтому я сообщил об этом на github.
Я думаю, что могу запустить произвольный код в каждой тестовой базе данных specjour, установив Specjour::Configuration.prepare
в .specjour / hooks.rb, поэтому, если есть какие-либо задачи rake или другой код, который мне нужно запустить, он может там работать.
Я бы рекомендовал удалить вашу тестовую базу данных, а затем заново создать ее и перенести:
bundle exec rake db:drop RAILS_ENV=test bundle exec rake db:create RAILS_ENV=test bundle exec rake db:schema:load RAILS_ENV=test
После этих шагов вы можете запустить свои спецификации:
gerry3 отметил, что:
Однако, если вы используете PostgreSQL, это не сработает, потому что загружается среда rails, которая открывает соединение с базой данных. Это приводит
prepare
к сбою вызова, потому что БД нельзя отбросить. Хитрая штука.источник
rake db:test:prepare
.rake db:test:prepare
с Postgres. Вы, должно быть, видите свою проблему по какой-то другой причине.RAILS_ENV=test bundle exec rake db:drop db:create db:schema:load
rake db:test:prepare
это устарело в Rails 4.bundle exec rake db:drop db:create db:schema:load RAILS_ENV=test
Все предоставленные решения требуют загрузки среды Rails, что в большинстве случаев не является желаемым поведением из-за очень больших накладных расходов и очень низкой скорости.
DatabaseCleaner
gem также довольно медленный, и он добавляет еще одну зависимость вашему приложению.После нескольких месяцев досады и огорчения по причинам, приведенным выше, я наконец нашел следующее решение, которое мне нужно. Это красиво, просто и быстро. В
spec_helper.rb
:config.after :all do ActiveRecord::Base.subclasses.each(&:delete_all) end
Самое приятное в этом: он очистит только те таблицы, которые вы эффективно затронули (нетронутые модели не будут загружены и, следовательно, не появятся
subclasses
, а также причина, по которой это не работает раньше тестов). Кроме того, он запускается после тестов, поэтому (надеюсь) зеленые точки появятся сразу.Единственным недостатком этого является то, что если у вас есть грязная база данных перед запуском тестов, она не будет очищена. Но я сомневаюсь, что это серьезная проблема, поскольку тестовая база данных обычно не затрагивается извне.
редактировать
Видя, что этот ответ приобрел некоторую популярность, я хотел отредактировать его для полноты: если вы хотите очистить все таблицы, даже те, которые не были затронуты, вы должны иметь возможность сделать что-то вроде «хаков» ниже.
Хак 1 - предварительная загрузка всех моделей для
subclasses
методаОцените это перед звонком
subclasses
:Dir[Rails.root.join("app", "models", "**", "*.rb")].each(&method(:require))
Учтите, что этот метод может занять некоторое время!
Хак 2 - усечение таблиц вручную
ActiveRecord::Base.connection.tables.keep_if{ |x| x != 'schema_migrations' }
даст вам все имена таблиц, с которыми вы можете сделать что-то вроде:
case ActiveRecord::Base.configurations[Rails.env]["adapter"] when /^mysql/, /^postgresql/ ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}") when /^sqlite/ ActiveRecord::Base.connection.execute("DELETE FROM #{table_name}") ActiveRecord::Base.connection.execute("DELETE FROM sqlite_sequence where name='#{table_name}'") end
источник
Похоже, что в Rails 4.1+ лучшим решением будет просто добавить
ActiveRecord::Migration.maintain_test_schema!
rails_helper послеrequire 'rspec/rails'
.т.е. вам больше не нужно беспокоиться о подготовке базы данных.
https://relishapp.com/rspec/rspec-rails/docs/upgrade#pending-migration-checks
источник
В подпружиненном приложении Rails 4 my
bin/setup
обычно расширяется, чтобы содержатьputs "\n== Preparing test database ==" system "RAILS_ENV=test bin/rake db:setup"
Это очень похоже на ответ левиафана , плюс заполнение тестовой БД, как
Как упоминается в комментарии, если мы хотим сначала удалить БД,
rake db:reset
именно это.Я также считаю, что это дает больше отзывов по сравнению с
rake db:test:prepare
.источник
Я начал с удаления тестовой базы данных
rake db:drop RAILS_ENV=test
при попытке создать новую тестовую базу данных я столкнулся с проблемой, потому что моя учетная запись пользователя не совпадала с учетной записью, которая владеет базами данных, поэтому вместо этого я создал базу данных в PostgreSQL.
введите
psql
в командной строке, а затем выполните приведенную ниже команду, чтобы создать тестовую базу данных, которая использует учетную запись, отличную от вашей.CREATE DATABASE your_database_name OWNER your_db_owner;
затем запустите свои миграции в тестовой среде.
rake db:migrate RAILS_ENV=test
источник