Как я могу найти, где генерируется исключение во время выполнения Minitest в Ruby?

#ruby #minitest #ruby-on-rails-2

#ruby #minitest #ruby-on-rails-2

Вопрос:

Мой Ruby Minitest завершается с ошибкой, подобной этой:

 <"undefined method `Error' for Api:Module">
  

На самом деле отсутствует не метод, а класс:

 class Api::Error
  

Этот класс определен в lib / api /error.rb.

Я попытался добавить эту строку в config / environment.rb в моем приложении rails 2:

 config.autoload_paths  = %W( #{RAILS_ROOT}/lib )
  

Это ничего не дает. Я не знаю, где и определен ли RAILS_ROOT (это стандартная переменная rails 2?), Но я скопировал ее из закомментированной строки в существующем исходном коде.

Как я могу убедиться, что класс загружен, или найти, где его нет? Подклассы Api::Error создаются во многих файлах, и я не хочу редактировать их все. Поскольку класс не может быть найден, stacktrace не отображает место, где происходит реальное повышение. Пошаговое выполнение кода с использованием pry не работает, потому что, как только я добираюсь до метода «get» в макете веб-сервиса, я не могу вмешаться.

Ответ №1:

Как только я нашел, где создавалось исключение, я поэкспериментировал.

Таким был исходный код, который вызвал проблему:

   raise Api::Error @p4_client
  

Это изменение, которое я внес:

   raise Api::Error.new(@p4_client)
  

Явный вызов конструктора с помощью new вместо того, чтобы позволить логике raise в Ruby сделать это, решил проблему.

Эта логика без явного вызова отлично работала в 1.8.7, но дает сбой в 1.9.3. Все делегируется через уровни Actionpack.