2016-04-21 10 views
0

Also ich möchte Controller testen, der Gerät verwendet.Schienen und Gerät - Test-Controller bei der Anmeldung und abgemeldet

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 

Ich folgte this guide from devise wiki. Also habe ich ControllerMacros Modul, wie Sie hier sehen können:

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 

und umfasste sie und andere benötigte Dinge rails_helper:

require_relative 'support/controller_macros.rb' 

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

Hier ist admin Werk:

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

Aber jetzt Ich weiß nicht, wie man sich abmeldet? Wie sign_in_admin vor jedem Test ausgeführt wird, aber ich muss für einige der Tests Admin unterschreiben. Was ist der beste Weg, um diesen Controller mit signed in/out admin zu testen?

btw bin ich irgendwie neu zu Test

Antwort

1

Devise einige Hilfsmethoden zum Testen bereitstellt, login_user enthält, die ein Benutzer braucht, so sollten Sie nicht die sign_in_admin Funktion erstellen müssen. Wenn Sie before (: all) oben im Block verwenden, haben Sie sich im Admin für die gesamte Sammlung von Spezifikationen angemeldet.

Verwenden Sie vorher (: jedes) in den einzelnen Kontexten, die Sie signed_in_admin möchten.

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

Rubin sagt: lib/rspec/core/example_group.rb: 675: in 'method_missing ': nicht definierte Methode' login_user' für RSpec :: ExampleGroups :: ArticlesController :: GETNEW :: AdminSignedIn: Klasse (NoMethodError). Muss ich es irgendwo einbeziehen? – dominikduda

+0

Entschuldigung, es sollte sign_in sein, nicht einloggen. Ich habe meine Antwort bearbeitet. Sie müssen rspec benötigen und die Testhelfer in Ihren Spezifikationshelfer aufnehmen. RSpeconfigure do | config | config.include Devise :: TestHelpers, geben Sie Folgendes ein:: controller end Sie können über die Testhelfer in den Gerätedokumenten unter https://github.com/plataformatec/devise nachlesen. – margo

+0

funktioniert einwandfrei, danke! – dominikduda

0

besseren Weg ist before Aktion in einen Kontext zu schließen. Die Kontexte sind signed_in und non-singed in. So können Sie etwas tun, wie folgt:

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 
Verwandte Themen