Rails: связь между вспомогательными модулями RSpe c - PullRequest
0 голосов
/ 14 февраля 2020

Буду очень признателен за несколько советов по следующему.

Ниже приведен упрощенный пример нашей настройки.

Я определил некоторые модули Helper в нашем тесте RSpe c suite:

## spec/rails_helper.rb

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

RSpec.configure do |config|
  config.include ViewHelpers
end



### spec/support/view_helpers/base.rb

# frozen_string_literal: true

module ViewHelpers
  class Base
    # class content
  end
end



### spec/support/view_helpers/admins/payments/new.rb

# frozen_string_literal: true

module ViewHelpers
  module Admins
    module Payments
      class New < Base
        # class content
      end
    end
  end
end

С этой настройкой спецификации работают идеально локально; подкласс New наследуется от Base, как и ожидалось. Однако, когда тесты выполняются на Travis CI, мы получаем следующую ошибку:

NameError:
1433  uninitialized constant ViewHelpers::Admins::Payments::Base
1434# ./spec/support/view_helpers/admins/payments/new.rb:6:in `<module:Payments>'
1435# ./spec/support/view_helpers/admins/payments/new.rb:5:in `<module:Admins>'
1436# ./spec/support/view_helpers/admins/payments/new.rb:4:in `<module:ViewHelpers>'
1437# ./spec/support/view_helpers/admins/payments/new.rb:3:in `<top (required)>'
1438# ./spec/rails_helper.rb:34:in `block in <top (required)>'
1439# ./spec/rails_helper.rb:34:in `each'
1440# ./spec/rails_helper.rb:34:in `<top (required)>'
1441# ./spec/controllers/admins/billpayers_controller_spec.rb:3:in `<top (required)>'

Я также пытался наследовать с явным пространством имен:

# frozen_string_literal: true

module ViewHelpers
  module Admins
    module Payments
      class New < ViewHelpers::Base
        # class content
      end
    end
  end
end

Опять же, это успешно выполняется локально но ошибки Travis CI:

NameError:
1433  uninitialized constant ViewHelpers::Base
1434# ./spec/support/view_helpers/admins/payments/new.rb:6:in `<module:Payments>'
1435# ./spec/support/view_helpers/admins/payments/new.rb:5:in `<module:Admins>'
1436# ./spec/support/view_helpers/admins/payments/new.rb:4:in `<module:ViewHelpers>'
1437# ./spec/support/view_helpers/admins/payments/new.rb:3:in `<top (required)>'
1438# ./spec/rails_helper.rb:34:in `block in <top (required)>'
1439# ./spec/rails_helper.rb:34:in `each'
1440# ./spec/rails_helper.rb:34:in `<top (required)>'
1441# ./spec/controllers/admins/billpayers_controller_spec.rb:3:in `<top (required)>'

Я довольно озадачен тем, почему это работает локально, но не на CI. Был бы очень признателен за любую поддержку и понимание.

Спасибо Сэм

Ответы [ 2 ]

0 голосов
/ 14 февраля 2020

Оказывается, порядок

Dir[Rails.root.join("spec/support/**/*.rb")]

зависит от операционной системы и файловой системы.

Это означает, что подклассы требовались до суперкласса.

Решение:

Dir[Rails.root.join("spec/support/**/*.rb")].sort
0 голосов
/ 14 февраля 2020

Привет, вы дважды проверили настройки автозагрузки? (https://guides.rubyonrails.org/autoloading_and_reloading_constants.html)

Классы автозагрузки и кэша могут быть настроены по-разному в зависимости от настроек среды:

├── config/environments
    ├── development.rb
    ├── production.rb
    └── test.rb
...