2016-05-28 3 views
0

Für Controller, die davon ausgehen, dass ein Benutzer bereits authentifiziert wird, wie soll ich meine Tests schreiben?Wie schreibe ich rspec Tests für Controller, die Authentifizierung annehmen

Ich muss wahrscheinlich nicht die Login-Funktion testen, also ist es am besten, nur einen Benutzer oder was auch immer meine Authentifizierung übernimmt irgendwie injizieren?

Mein application_controller enthält ein Modul "current_user".

module CurrentUser 
    def self.included(base) 
    base.send :helper_method, :current_user 
    end 

    def current_user 
    ... # returns a User model instance 
    end 
end 

class ApplicationController < ActionController::Base 
    include CurrentUser 

Dann habe ich einen Admin-Controller, die eine before_action Methode, die sicherstellt, die current_user vorhanden ist.

+0

Devise oder nicht Devise? 'include CurrentUser' lässt mich nicht nachdenken. – fbelanger

+0

@fbelanger keine Geräte, benutzerdefinierte Authentifizierung. – Blankman

+0

Wie überprüfen Sie, dass der Benutzer authentifiziert wurde? Könnten Sie nicht einfach eine Methode zum Anmelden erstellen, ähnlich wie bei der Entwicklung? – fbelanger

Antwort

1

Sie können dies leicht erreichen, indem Sie ein Anliegen schreiben und zu jeder Spezifikation, die ein Controller ist, gehören, in diesem Zusammenhang unterstützen wir einige Hilfsmethoden, um sich am System anzumelden.

So wird der Code wie:

spec/support/controller_authentication_helper.rb

module ControllerAuthenticationHelper extend ActiveSupport::Concern 
    module ClassMethods 
    def login_user 
     before do 
     # I expect you are using Devise here, if not, just modify below line 
     request.env['devise.mapping'] = Devise.mappings[:user] 
     @current_user = FactoryGirl.create(:user, :confirmed, :verified) 
     sign_in @current_user 
     end 
    end 
    end 
end 

RSpec.configure do |config| 
    config.include ControllerAuthenticationHelper, type: :controller 
end 

So, jetzt wird der Test einfach wie:

require 'rails_helper' 

describe MyController, type: :controller do 
    # Use this method to login 
    login_user 
    # Now you can access current_user anywhere in your test 
end 

Jetzt wird alles einfach! Die Idee kommt von dieser source code von Devise