2014-01-06 37 views
3

我是RSpec的新手,我只是想知道如何在控制器中的多个操作中重用上下文。具体来说,我有这样的代码:如何在RSpec中重用上下文?

describe "GET index" do 
    context "when authorized" do 
    ... 
    end 

    context "when unauthorized" do 
    it "denys access" 
    end 
end 

describe "GET show" do 
    context "when authorized" do 
    ... 
    end 

    context "when unauthorized" do 
    it "denys access" 
    end 
end 

... 

而且我想干一点。每个操作的未授权上下文都是相同的,我如何重用它?

回答

5

共享的例子是您的朋友:

创建一个新的文件,像spec/shared/unauthorized.rb,包括它在你的spec_helper然后格式化是这样的:

shared_examples_for "unauthorized" do 
    context "when unauthorized" do 
    it "denys access" 
    end 
end 

然后在您的规格:

include_examples "unauthorized" 

在每个描述块中做这件事,你应该是金色的。

1

如果你使用流行的宝石Devise,您可以重新设计出这样的映射:对spec/spec_helper.rb

require "spec_helper" 

describe Worksheet::CompanyController do 
    login_user_admin #<= this macros on /spec/support/controller_macros.rb 

    describe '#create' do 
    it 'admin login and create worksheet' do 
     post :create, worksheet_company: attributes_for(:"Worksheet::Company") 
     expect(response.status).to eq(302) 
     expect(response).to redirect_to(admin_root_path) 
    end 
    end 

创建并登录admin_user spec/support/controller_macros.rb

module ControllerMacros 
    def login_user_admin 
    before(:each) do 
     @request.env["devise.mapping"] = Devise.mappings[:user_admin] 
     user_admin = FactoryGirl.create(:user_admin) 
     user_admin.confirm! 
     sign_in user_admin 
    end 
    end 
end 

RSpec.configure do |config| 
    ... 
    config.include Devise::TestHelpers, type: :controller 
    config.extend ControllerMacros, type: :controller 
    ... 
end 
相关问题