2016-04-06 71 views
2

我想添加一个包含帮助我以用户身份登录的方法的模块。那就是:将辅助模块添加到Rspec

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

回答

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如果其他色器件映射的宏观格局。

+0

一些更多的探索,我发现需要块之前被包裹在一个代码之后。出于我不明白的原因,否则将无法正常工作。 – stoebelj

+0

你可以发表一个现在的样子,以及它在将它添加到块之前的样子吗?无论从'before'块中访问什么,都应在'it'示例块中提供。 –

0

除了其他的答案,你应该考虑只包括该模块使用下面的代码相关的规格类型:

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