stoebelj
stoebelj

Reputation: 1598

Adding helper module to Rspec

I would like to add a module that includes a method to help me log in as a user. Here it is:

module TestHelper
  require 'spec_helper'

  ALL_USERS = ["administrator", "instructor", "regular_user"]

  def self.login_as(user_type)
    user = User.find_by(global_role_id: GlobalRole.send(user_type))
    @request.env["devise.mapping"] = Devise.mappings[:user]
    sign_in user
  end
end

The spec that's calling it is

require 'spec_helper'

RSpec.describe QuestionsController, :type => :controller do
  include Devise::TestHelpers
  include TestHelper

  describe "a test" do
    it "works!" do
      TestHelper.login_as("administrator")
    end
  end
end

And here is the spec_helper

RSpec.configure do |config|
  config.include TestHelper, :type => :controller

The error I get is: undefined method 'env' for nil:NilClass It looks like my module doesn't have access to @request.

My question is: how do I access and @request in the external Module?

Upvotes: 2

Views: 1399

Answers (2)

Anthony E
Anthony E

Reputation: 11235

In addition to the other answers, you should consider only including this module for relevant spec types using the following code:

config.include TestHelper, type: :controller  #  Or whatever spec type(s) you're using

Upvotes: 2

Jeremiah Heller
Jeremiah Heller

Reputation: 71

You could pass @request in to TestHelper.login_as from the tests. Eg

module TestHelper
  def self.login_as(user_type, request)
    ...
    request.env['devise.mapping'] = Devise.mappings[:user]
    ...
  end
end

...

describe 'log in' do
  it 'works!' do
    TestHelper.login_as('administrator', @request)
  end
end

But probably better to follow the macro pattern from the devise wiki if other devise mappings in play.

Upvotes: 1

Related Questions