Учитывая типичную среду Rails 3, почему я не могу выполнить какие-либо тесты? - PullRequest
7 голосов
/ 08 марта 2011

Я работаю над написанием простых модульных тестов для проекта Rails 3, но на самом деле я не могу выполнить какие-либо тесты.

В данном случае попытка запустить тест, автоматически сгенерированный Rails, не удалась:

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  # Replace this with your real tests.
  test "the truth" do
    assert true
  end
end

Приводит к следующей ошибке:

<internal:lib/rubygems/custom_require>:29:in `require': no such file to load --
test_helper (LoadError)
        from <internal:lib/rubygems/custom_require>:29:in `require'
        from user_test.rb:1:in `<main>'

Закомментируйте строку require 'test_helper' и попытайтесь запустить результаты теста с этой ошибкой:

user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)

Похоже, что гемы пакета действий установлены правильно и обновлены:

actionmailer (3.0.3, 2.3.5)
actionpack (3.0.3, 2.3.5)
activemodel (3.0.3)
activerecord (3.0.3, 2.3.5)
activeresource (3.0.3, 2.3.5)
activesupport (3.0.3, 2.3.5)

Ruby находится на 1.9.2p0, а Rails на 3.0.3.

Пример дампа моей тестовой директории выглядит следующим образом:

/fixtures
/functional
/integration
/performance
/unit
-- /helpers
   -- user_helper_test.rb
-- user_test.rb
test_helper.rb

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

Редактировать 9 марта

Предложение Ксавьера Холта , явно указывающее путь к test_helper; однако это выявило проблему с ActiveSupport.

Теперь, когда я пытаюсь запустить тест, я получаю следующее сообщение об ошибке (как также указано выше):

user_test.rb:3:in `<main>': uninitialized constant Object::ActiveSupport (NameError)

Но, как вы можете видеть выше, Action Pack все установлен и обновлен до настоящего времени.

Редактировать 13 марта

При попытке запустить тесты с использованием rake test:units в консоль выводится следующая трассировка стека:

test/unit/bookmark_test.rb:3:in `<top (required)>': uninitialized constant Objec
t::ActiveSupport (NameError)
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `load'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `block in <main>'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `each'
        from C:/Ruby192/lib/ruby/gems/1.9.1/gems/rake-0.8.7/lib/rake/rake_test_loader.rb:5:in `<main>'
rake aborted!

Итак, просматривая указанный выше файл, я вижу следующее:

#!/usr/bin/env ruby

# Load the test files from the command line.

ARGV.each { |f| load f unless f =~ /^-/  }

Насколько мне известно, все выглядит так, как ожидалось.

Ответы [ 3 ]

10 голосов
/ 11 марта 2011

Ваш test/test_helper файл должен был быть создан при создании приложения.Он содержит это ценное содержимое:

ENV["RAILS_ENV"] = "test"
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'

class ActiveSupport::TestCase
  # Setup all fixtures in test/fixtures/*.(yml|csv) for all tests in alphabetical order.
  #
  # Note: You'll currently still have to declare fixtures explicitly in integration tests
  # -- they do not yet inherit this setting
  fixtures :all

  # Add more helper methods to be used by all tests here...
end

Вторая строка здесь наиболее важна: для нее требуется файл config/environment.rb в корне вашего приложения, что, в свою очередь, требует много других вещей, включаяценный (мне нравится это слово сегодня, хорошо?) ActiveSupport константа.

Когда вы генерируете контроллер, модель или каркас, он также генерирует тесты для них.Я просто запустил rails g scaffold ticket в своем приложении, и оно сгенерировало test/unit/ticket_test.rb, которое содержит это:

require 'test_helper'

class TicketTest < ActiveSupport::TestCase
  # Replace this with your real tests.
  test "the truth" do
    assert true
  end
end

В первой строке этого файла потребуется файл test/test_helper.rb, который мы только что увидели.Это загрузит ActiveSupport и класс TestCase внутри него, что сделает этот тест выполнимым.Все остальное просто идет оттуда.

Со всеми этими объяснениями (даже если это то, что вы уже знаете), я делаю большую ставку на то, что маскирует ваше LOAD_PATH,вызывая удаление каталога test из него.

Что действительно необычно, так это то, что когда вы указываете полный путь к test/test_helper.rb, вы говорите, что он загружает его, но ActiveSupport по-прежнему не определен,Ну, это должно быть загружено в соответствии с описанием выше.Это на самом деле загрузка config/environment.rb?Можете ли вы поставить что-то вроде:

puts "LOADING CONFIG/ENVIRONMENT.RB"

в верхней части файла config/environment.rb, а затем снова запустить тесты?Это должен быть вывод.Очень необычно.

Продолжая тему о LOAD_PATH ... Есть маленький грязный секрет, о котором вы нам не рассказываете?

На самом деле, Дэн Чейл делаетхороший момент.Вы можете запускать тесты, используя ruby test/unit/ticket_test.rb, в этом случае test_helper будет недоступно, но все равно это не объясняет, почему при указании полного пути вы все равно получаете неопределенную константу ActiveSupport.

Если вы хотите запустить один тест, вы должны сделать следующее:

ruby -Itest test/unit/ticket_test.rb

Эта опция -I добавляет каталог test в путь загрузки, что означает test_helperфайл будет доступен через прямой require 'test_helper'.Если после этого все равно произойдет ошибка, я считаю, что ваш test/test_helper.rb пуст или поврежден.

0 голосов
/ 12 марта 2011

Проблема в том, как вы выполняете тесты. Простой вызов ruby test/unit/user_test.rb не устанавливает путь загрузки, что объясняет проблемы, с которыми вы столкнулись.

rake test:units - это то, что вы хотите и должны работать сразу.

0 голосов
/ 11 марта 2011

Извините за сообщение здесь, но я пока не могу комментировать вопросы.

в какой среде вы работаете, Win (проблема с файлом .gemspec) Linux, Mac?

Вы используете RVM?

Test-Unit устанавливается по умолчанию вместе с Rails, если вы установили gem Test-Unit, вы получите конфликт между 2. попытайтесь удалить гем, и ваши тесты должны начать работать.

При запуске в Windows я бы удалил "autotest", затем перейдите к следующему каталогу

   drive:\Ruby192\lib\ruby\gems\1.9.1\specifications

Здесь вы найдете файлы .gemspec. Убедитесь, что у вас нет 2 файлов autotest.gemspec или каких-либо, в этом отношении. если это так, удалите (удалите) их, затем загрузите и установите gem заново. Получить последнюю версию с помощью переключателя версий.

Вы сможете запускать свои автотесты. Я уже сталкивался с этим однажды, поэтому, чтобы исправить это, я просто удалил тестовые файлы view и helper и записал все в стандартный тестовый файл. Кроме того, я знаю, что при запуске Windows Autotest возникали проблемы из-за того, что установщик и сборщик ruby ​​неправильно очищали вещи и забывали файлы.

Я найду для вас ссылку, чтобы лучше объяснить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...