【问题标题】:Rails: Communicating between RSpec helper modulesRails:在 RSpec 辅助模块之间进行通信
【发布时间】:2020-02-14 15:00:04
【问题描述】:

我将非常感谢以下方面的建议。

下面我有一个简化的设置示例。

我在我们的 RSpec 测试套件中定义了一些 Helper 模块:

## 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 上无效。 非常感谢任何支持和见解。

谢谢 山姆

【问题讨论】:

    标签: ruby-on-rails ruby inheritance rspec travis-ci


    【解决方案1】:

    您好,您是否仔细检查了您的自动加载配置? (https://guides.rubyonrails.org/autoloading_and_reloading_constants.html)

    自动加载和缓存类可能会根据您的环境配置进行不同的配置:

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

    【讨论】:

      【解决方案2】:

      原来是排序

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

      取决于操作系统和文件系统。

      这意味着在超类之前需要子类。

      解决方案:

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

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-15
        • 1970-01-01
        • 2016-05-05
        • 2014-02-10
        相关资源
        最近更新 更多