【问题标题】:Rspec not loading ControllerMacros module in Linux (but fine on OS X)Rspec 没有在 Linux 中加载 ControllerMacros 模块(但在 OS X 上很好)
【发布时间】:2015-11-15 07:35:45
【问题描述】:

我在一个使用 Devise 和 Rspec 的 Rails 应用程序中编写了一些控制器测试。在this guide 之后,我在/spec/support/ 目录中创建了一个controller_macros.rb。同目录下还有一个devise.rb文件,里面有:

RSpec.configure do |config|
  config.include Devise::TestHelpers, type: :controller
  config.extend ControllerMacros, :type => :controller
end

spec_helper.rb 文件中需要这两个文件,使用以下行:

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

现在奇怪的是:这种方法在 OS X 笔记本电脑上运行良好,但在我的 Linux 桌面上却失败了。它们都使用相同的 RVM 设置、相同的 gemset、相同的一切。

我在 Linux 中运行测试时遇到的错误是:

uninitialized constant ControllerMacros (NameError)

显然controller_macros.rb 模块无法在 Linux 中加载。我看到 SO 的答案表明 config.extend 可以更改为 config.include,但这并不能解决问题。

有什么想法可以查看或可以测试什么来帮助隔离问题?

我使用的是 Rails 4.1.8 和 Rspec 3.1.7。

【问题讨论】:

  • 发现使用 config.autoload_paths += %W(#{config.root}/spec/support) 显式自动加载 application.rb 中的路径可以解决问题 - 但我很想知道为什么一台机器需要这个,而另一台不需要。
  • 在带有 Rails 4.2 和 Rspec 3.2.0 的 Mac OS X 上得到这个

标签: ruby-on-rails rspec devise


【解决方案1】:

我也为此苦苦挣扎。答案对我不起作用。这就是我所做的(Ubuntu、Rails 4、Rspec 3):

spec/rails_helper.rb

# <snip> env stuff

require 'spec_helper'
require 'rspec/rails'
require 'devise'
require 'support/controller_macros'

# <snip> some non-devise stuff

RSpec.configure do |config|

  # <snip> some more non-devise stuff

  config.include Devise::TestHelpers, type: :controller
  config.include ControllerMacros, type: :controller
end

spec/support/controller_macros.rb

module ControllerMacros
  def login_user
    @request.env["devise.mapping"] = Devise.mappings[:user]
    user = FactoryGirl.create(:user)
    sign_in user
  end
end

students_controller.rb

require "rails_helper"

describe StudentsController, type: :controller do

  before do
    login_user
  end

  describe "GET index" do
    it "has a 200 status code" do
      get :index

      response.code.should eq("200")
    end
  end
end

【讨论】:

  • 为我工作。谢谢你
  • 唯一适合我的解决方案。我已经在网上搜索了这个,其他的似乎没有帮助
【解决方案2】:

我通过添加解决了这个问题

require Rails.root.join("spec/support/macros/controller_macros.rb")

到我的 spec/support/devise.rb 文件的顶部

【讨论】:

  • 因为这行 Dir[Rails.root.join("spec/support/**/*.rb")].each { |f|在 spec/rails_helper.rb 中需要 f },在 spec/support/macros/controller_macros.rb 之前加载 spec/support/devise.rb。有很多方法可以解决这个问题。
  • 当我尝试得到一个额外的 rspec 错误:required /Users/.../spec/support/controller_macros.rb... /Users/.../.rvm/gems/ruby-2.3.1/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:229:in `require': no implicit conversion of Pathname into String (TypeError)
猜你喜欢
  • 1970-01-01
  • 2015-05-01
  • 2016-02-16
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-20
相关资源
最近更新 更多