#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. Ах, теперь я понимаю лучше. Был рад признать, что то, что я сделал, было немного глупо, но хотел точно понять, насколько это глупо 🙂