2016-04-21 72 views
0

所以我想測試使用設計的控制器。Rails和設計 - 測試控制器登錄和退出時

require 'rails_helper' 

describe ArticlesController do 
    before(:all) { @article = FactoryGirl.create(:article) } 

    sign_in_admin 

    describe 'GET new' do 
    let(:call_request) { get :new } 

    before { call_request } 

    context 'admin signed in' do 
     it { is_expected.to respond_with :ok } 
    end 

    context 'admin signed out' do 
     it { is_expected.to respond_with 302 } 
    end 
    end 
end 

我跟着this guide from devise wiki。因此,我創建ControllerMacros模塊,你可以在這裏看到:

module ControllerMacros 
    def sign_in_admin 
    before(:each) do 
     @request.env['devise.mapping'] = Devise.mappings[:admin] 
     @admin = FactoryGirl.create(:admin) 
     sign_in @admin 
    end 
    end 
end 

而且包括它和其他需要的東西rails_helper:

require_relative 'support/controller_macros.rb' 

RSpec.configure do |config| 
    config.include Devise::TestHelpers, type: :controller 
    config.extend ControllerMacros, type: :controller 
(...) 

這裏是admin廠:

FactoryGirl.define do 
    factory :admin do 
    email '[email protected]' 
    password 'password' 
    end 
end 

但現在我不知道如何註銷管理員?由於sign_in_admin在每次測試之前都在執行,但我需要爲某些測試簽署管理員。使用登錄/註銷管理員測試此控制器的最佳方式是什麼?

順便說一句,我還挺新的測試

回答

1

設計提供用於測試一些輔助方法,包括login_user這需要用戶,所以你不應該需要創建sign_in_admin功能。另外,通過在塊頂部使用before(:all),您已經在整個規格套件中登錄了管理員。

在您想要signed_in_admin的各個上下文之前使用(:each)。

describe ArticlesController do 
    describe 'GET new' do 
    let(:call_request) { get :new } 
    let(:admin_user) { FactoryGirl.create(:admin) } 

    before { call_request } 

    context 'admin signed in' do 
     sign_in(admin_user) 
     it { is_expected.to respond_with :ok } 
    end 

    context 'admin not signed in' do 
     it { is_expected.to respond_with 302 } 
    end 
    end 
end 
+0

紅寶石說:LIB/rspec的/核心/ example_group.rb:675:在'method_missing的 ':未定義的方法'login_user' 的RSpec的:: ExampleGroups :: ArticlesController :: GETNEW :: AdminSignedIn:Class(NoMethodError)。我需要將它包含在某個地方嗎? – dominikduda

+0

對不起,它應該是sign_in,而不是登錄。我編輯了我的答案。您需要rspec並在您的規範助手中包含測試助手。 RSpec.configure do | config | config.include Devise :: TestHelpers,輸入::controller end你可以閱讀設計文檔https://github.com/plataformatec/devise中的測試助手,它們位於底部。 – margo

+0

完美無瑕,謝謝! – dominikduda

0

更好的辦法是將before動作關閉到上下文中。上下文是signed_in中沒有燒結。所以,你可以做一些事情如下:

describe 'GET new' do 
    let(:call_request) { get :new } 

    before { call_request } 

    context "signed in" do 
     before { sign_in_admin } 

     it { is_expected.to respond_with :ok } 
    end 

    context 'non-singed in' do 
     it { is_expected.to respond_with 302 } 
    end 
    end