设计Rspec未定义的方法`env'为零:NilClass

时间:2017-02-21 16:39:12

标签: ruby-on-rails ruby rspec devise

我已经搜索过了,没有其他人的结果似乎对我有用:

我根据Devise的建议,为我的规范提供ControllerHelper方法:

def login_existing_user
  @request.env["devise.mapping"] = Devise.mappings[:user]
  user = FactoryGirl.create(:user)
  company = FactoryGirl.create(:company)
  user.company_id = company.id
  sign_in user
end

我还在此方法中创建了Company,因为用户可以通过注册过程的第2步获取经过身份验证的首页。

此时,我只想尝试使用ScansControllerSpec登录用户:

RSpec.describe ScansController, type: :controller do

  before(:all) do
    login_existing_user
    @device = build(:device)
  end

  describe "GET #create" do
    it "returns http success" do
      get :create, :device_id => @device.id
      puts response
      # expect(response).to have_http_status(:success)
    end
  end

  ....
end

但是我的每一个CRUD方法RSpec都得到了这个:

1) ScansController GET #create returns http success
     Failure/Error: @request.env["devise.mapping"] = Devise.mappings[:user]

     NoMethodError:
       undefined method `env' for nil:NilClass
     # ./spec/support/controller_helpers.rb:15:in `login_existing_user'
     # ./spec/controllers/scans_controller_spec.rb:6:in `block (2 levels) in <top (required)>'

正如其他帖子所建议的那样,我将Devise::TestHelpers包含在我的rails_helper.rb文件中。我还包括了我的ControllerHelpers

RSpec.configure do |config|
  config.include Devise::TestHelpers, type: :controller
  config.include Warden::Test::Helpers
  Warden.test_mode!

  config.infer_spec_type_from_file_location!

  config.include ControllerHelpers, type: :controller

  config.after do
    Warden.test_reset!
  end
end

最后,我需要能够记录用户以测试受保护的控制器方法是否有效。我不确定这是否是关联问题,因此我要添加一个用户必须拥有company,并且公司必须拥有subscription才能成功登录。

......但是我甚至无法做到这一点,因为这个错误阻碍了我。

1 个答案:

答案 0 :(得分:0)

似乎已经通过以下方式解决了这个问题:http://willschenk.com/setting-up-testing/