#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.