Запустите определенный тест рейка перед запуском конкретного теста в RAILS - PullRequest
0 голосов
/ 04 мая 2011

Я тестирую приложение со встроенной функцией модульного тестирования, предоставляемой rails. Проблема в том, что один тест сильно зависит от расчетов с идентификаторами, и мы должны это проверить. Поскольку активная запись не сбрасывает auto_increment при откате транзакции, у нас возникли некоторые проблемы.

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

Сначала я пытаюсь определить метод настройки для сброса всех необходимых значений auto_increment следующим образом:

def setup
  ActiveRecord::Base.connection.execute("ALTER TABLE 'table_name1' AUTO_INCREMENT = 1;") 
  ActiveRecord::Base.connection.execute("ALTER TABLE 'table_name2' AUTO_INCREMENT = 1;")
end

но тесту не удалось выдать эту ужасную ошибку:

ActiveRecord :: StatementInvalid: Mysql :: Ошибка: SAVEPOINT active_record_1 не существует: Откат к SAVEPOINT active_record_1

Затем я пытаюсь вызвать db: test: prepare и db: fixtures: load в методе установки, но это тоже не удалось. Кроме того, это сильно замедлит тест, поскольку метод установки запускается перед каждым тестом в файле, не так ли?

Итак, как я могу запустить эти грабли непосредственно перед определенным набором тестов или тестовым файлом (не знаю, как его вызвать) и только для этого?

Спасибо! :)

Ответы [ 2 ]

2 голосов
/ 04 мая 2011

Вы сможете удалить свою тестовую базу данных, а затем запустить rake db:create RAILS_ENV=test, чтобы воссоздать базу данных из теста.Однако, если вы сделаете это в середине теста, вам также понадобится повторно заполнить базу данных действительными данными, что может стать серьезной проблемой в заднице, если вы выберете такой путь.

Вы также должны быть в состоянии использовать материал drop_table: table_name из миграций, чтобы сделать это.

ОДНАКО , ваши тесты не должны быть написаны таким образом, ниесли ваша БД структурирована таким образом, они полагаются на конкретные идентификаторы БД.Ваши тесты также не должны пересоздавать целые таблицы просто для сброса значения AUTO_INCREMENT.Это почти наверняка признак того, что вы не используете свои наборы тестов так, как они предназначены для использования.Но я также признаю, что это не идеальный мир, и я надеюсь, что это какой-то необычный крайний случай.: S

0 голосов
/ 31 декабря 2015

Вы можете использовать database_cleaner gem.затем в вашем database_cleaner.rb вы можете указать :pre_count и :reset_ids для сброса ваших идентификаторов.Я также рекомендую использовать отдельную базу данных для вашей тестовой среды.

...