Сбой Rake-теста только в тестовой среде

#ruby-on-rails #testing #rake

#ruby-on-rails #тестирование #rake

Вопрос:

Я запускаю «rake test» в своем проекте Rails 3.0.7 (Ruby 1.8.7) через командную строку.

Мое приложение rails — это довольно простое готовое приложение, поскольку я все еще учусь. Например. мой Gemfile — это:

 source 'http://rubygems.org'
gem 'rails', '3.0.7'
gem 'sqlite3'
  

Когда я делаю это без указания среды, это работает. Я предполагаю, что это влияет на разработку, поскольку, когда я пытаюсь указать на среду разработки, она все еще работает! Также, когда я запускаю «rake-тест: единицы измерения» или «rake-тест: функционалы», они тоже работают без ошибок.

Однако, когда я запускаю тестовую среду, модульные тесты не выполняются? Я пробовал это как из Rubymine IDE, так и из командной строки с теми же результатами.

Результаты трассировки выглядят следующим образом — сначала простой «rake-тест» :

 C:UsersBendevrailstest>rake test --trace
(in C:/Users/Ben/dev/railstest)
** Invoke test (first_time)
** Execute test
** Invoke test:units (first_time)
** Invoke test:prepare (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load (first_time)
** Invoke environment
** Execute db:schema:load
** Execute test:prepare
** Execute test:units
Loaded suite C:/dev/lang/Ruby187/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader Started
.......................
Finished in 2.821289 seconds.

23 tests, 24 assertions, 0 failures, 0 errors
** Invoke test:functionals (first_time)
** Invoke test:prepare
** Execute test:functionals
Loaded suite C:/dev/lang/Ruby187/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader Started
.............
Finished in 3.34668 seconds.

13 tests, 25 assertions, 0 failures, 0 errors
** Invoke test:integration (first_time)
** Invoke test:prepare
** Execute test:integration
  

И теперь сбой выполняется в тестовой среде

 C:UsersBendevrailstest>rake environment RAILS_ENV=test test --trace
(in C:/Users/Ben/dev/railstest)
** Invoke environment (first_time)
** Execute environment
** Invoke test (first_time)
** Execute test
** Invoke test:units (first_time)
** Invoke test:prepare (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Invoke test:functionals (first_time)
** Invoke test:prepare
** Execute test:functionals
Loaded suite C:/dev/lang/Ruby187/lib/ruby/gems/1.8/gems/rake-0.8.7/lib/rake/rake_test_loader Started
.............
Finished in 3.328125 seconds.

13 tests, 25 assertions, 0 failures, 0 errors
** Invoke test:integration (first_time)
** Invoke test:prepare
** Execute test:integration
Errors running test:units!
  

В сообщении об ошибке больше нет текста и никаких дополнительных указаний на то, что это за ошибки на самом деле. Мне пришлось повторно запустить db:schema:load обе среды sqlite3 и db:seed также заполнить несколько таблиц базы данных, хотя тестовые данные загружаются через fixtures в обычном режиме.

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

Комментарии:

1. Как насчет того, когда вы запускаете rake test:units ? Я не думаю, rake test что какой-либо вариант будет запускать его в любой среде, отличной от тестирования в нормальных условиях. (Напишите тест, который печатает Rails.env, запустите RAILS_ENV=development rake test и посмотрите, что выводится.)

2. Хороший момент, забыл сказать, что отдельные команды rake test: units и test: functionals работают без ошибок. Отредактировано выше, чтобы объявить об этом сейчас.

Ответ №1:

При запуске rake test все модульные, функциональные и интеграционные тесты выполняются в тестовой среде. Из того, что вы показали, тесты работают точно так, как ожидалось. Вам не нужно явно указывать rake использовать тестовую среду — это предполагается.

Комментарии:

1. Что ж, я думаю, я рад не указывать среду, если это вызывает проблему; но все еще озадачен, почему явное нацеливание на тестовую среду (по умолчанию) приводит к сбою команды?

2. Когда вы запускаете «rake-тест», вы начинаете с удаления структуры базы данных тестовой среды и замены ее структурой текущей среды (разработка по умолчанию). Когда вы запускаете «rake RAILS_ENV=test test», вы указываете ему заменить структуру тестовой базы данных структурой тестовой базы данных, что является сценарием, который не был протестирован (я не могу придумать вариант использования).

3. Ах, теперь я понимаю лучше. Был рад признать, что то, что я сделал, было немного глупо, но хотел точно понять, насколько это глупо 🙂