将辅助模块添加到Rspec

时间:2016-04-06 01:23:47

标签: ruby-on-rails ruby ruby-on-rails-4 rspec rspec-rails

我想添加一个模块,其中包含一个帮助我以用户身份登录的方法。这是:

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

调用它的规范是

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

这是spec_helper

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

我得到的错误是:undefined method 'env' for nil:NilClass我的模块看起来无法访问@request

我的问题是:如何在外部模块中访问和@request

2 个答案:

答案 0 :(得分:1)

您可以从测试中将@request传递给TestHelper.login_as。例如

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

但如果其他设计映射在游戏中,可能最好遵循devise wiki中的宏模式。

答案 1 :(得分:0)

除了其他答案之外,您还应考虑使用以下代码仅将此模块包含在相关规范类型中:

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