【问题标题】:undefined method `env' for nil:NilClassnil:NilClass 的未定义方法“env”
【发布时间】:2014-08-12 17:10:26
【问题描述】:

我将 rspec 从版本 2 升级到了 3。之后我遇到了这个问题:

Failures:

  1) AlbumsController GET #edit 
     Failure/Error: sign_in_and_switch_schema @user
     NoMethodError:
       undefined method `env' for nil:NilClass
     # ./spec/support/auth_helpers.rb:10:in `sign_in_and_switch_schema'
     # ./spec/controllers/albums_controller_spec.rb:12:in `block (2 levels) in <top (required)>'

spec_helper.rb 包含:

 RSpec.configure do |config|
    # most omitted
    config.include Warden::Test::Helpers
    config.include Devise::TestHelpers, type: :controller
 end

albums_controller_spec.rb

describe AlbumsController do

  let(:album) { create(:album) }

  before(:all) do
    @user = create :user
  end

  before(:each) do
    sign_in_and_switch_schema @user
  end

  after(:all) do
    destroy_users_schema @user
    destroy_user @user
  end

 # describe's part omitted
end

auth_helpers.rb 发生错误的部分:

def sign_in_and_switch_schema(user)
 # binding.pry
 @request.env["devise.mapping"] = Devise.mappings[:user] # <- error line
 sign_in :user, user

 Apartment::Tenant.switch(user.username) 
end

我一直在寻找另一个类似的问答,但没有发现任何帮助。让我知道是否应该包含更多内容。提前致谢。

【问题讨论】:

  • 错误出现在spec/support/auth_helpers.rb的第10行的sign_in_and_switch_schema方法中你能显示那个文件的内容吗?
  • 抱歉,我错过了 - Q 已更新
  • @mlainez:我在 auth_helpers.rb 中添加了 binding.pry。它清楚地表明@requestnil。我不知道我还能用它做什么,但我可以看看你是否告诉我。

标签: ruby-on-rails rspec devise rspec3


【解决方案1】:

解决方案是添加到 spec_helper.rb:

RSpec.configure do |config|
    config.infer_spec_type_from_file_location!
end

【讨论】:

    【解决方案2】:

    根据Devise TestHelper documentation,您应该只使用

    @request.env["devise.mapping"] = Devise.mappings[:user]
    

    当您测试继承了 Devise 控制器的控制器时。我猜 AlbumsController 不是从设计控制器继承的。我认为这些测试不需要这条线。

    尝试删除此行或创建另一个仅执行 sign_in 和 switch 的辅助方法:

    def simple_sign_in_and_switch(user)
      sign_in :user, user
      Apartment::Tenant.switch(user.username)
    end
    

    然后在您的测试用例中调用该方法:

    before(:each) do
      simple_sign_in_and_switch_schema @user
    end
    

    如果这可行,请尝试完全删除有故障的线路并运行完整的测试套件以查看其他地方是否需要它。如果是,请以另一种方法提取该行并仅在需要时使用。

    【讨论】:

    • 现在它显示NoMethodError: undefined method 'sign_in'。我认为config.include Devise::TestHelpers, type: :controller 不再适用于 Rspec 3。我试图删除 type: :controller 部分,但它向我显示了很大的堆栈跟踪,甚至没有转到 pry 部分。
    • 看看这个帖子,它可能会帮助你弄清楚发生了什么 => stackoverflow.com/questions/23859653/…
    • 我找到了解决方案! config.infer_spec_type_from_file_location!。无论如何,感谢您的时间和精力。
    • 您给我的链接显示了另一种指定规格类型的方法。这也是正确的。
    猜你喜欢
    • 2014-02-25
    • 2017-07-11
    • 2011-07-27
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多