Включить модуль не работает в гем - PullRequest
0 голосов
/ 27 июня 2018

У меня есть камень под названием private_lib. Файл lib/private_lib.rb содержит следующее:

require 'private_lib/version'
require 'private_lib/handicap'
require 'private_lib/traversal_cap'

module PrivateLib

end

Файл lib/private_lib/handicap.rb содержит следующее

# module for handicap functions
class Handicap
  include TraversalCap
  -- other code
end

и файл lib/private_lib/traversal_cap.rb содержит следующее

module TraversalCap
  def some_method
  end
  -- other code
end

У меня также есть тестовый файл spec/handicap_spec.rb, который содержит следующее

require "spec_helper"
describe Handicap do
  include TraversalCap
  -- some tests that access the ```Handicap``` class
  -- some tests that access directly the traversal_cap some_method.
end

Когда я запускаю rspec spec/handicap_spec, я получаю следующую ошибку

private_lib/lib/private_lib/handicap.rb:3:in `<class:Handicap>': uninitialized constant Handicap::TraversalCap (NameError)
    from private_lib/lib/private_lib/handicap.rb:2:in `<top (required)>'

Почему класс гандикапа не видит модуль traversal_cap?

1 Ответ

0 голосов
/ 27 июня 2018

Именно из-за порядка вам требуются файлы.

В то время, когда запускается строка require 'private_lib/handicap', она читает файл handicap.rb и попадает в строку, где вы include TraversalCap. Но вы еще не запустили require 'private_lib/traversal_cap', поэтому модуль не определен.

Быстрое исправление - изменить порядок вызовов require или, альтернативно, поставить require 'private_lib/traversal_cap' в верхней части файла гандикапа.

...