2012-06-12 14 views
14

Ich habe Probleme, meine Rspec-Tests ordnungsgemäß auf Elementen auszuführen, bei denen Devise versucht, einen Benutzer in einem before_filter zu authentifizieren.Authentifizierung mit Devise in Rspec-Tests

folgte ich dem Beispiel aus dem Git Devise wiki: How To: Controllers and Views tests with Rails 3 (and rspec)

spec/spec_helper.rb:

# This file is copied to spec/ when you run 'rails generate rspec:install' 
ENV["RAILS_ENV"] ||= 'test' 
require File.expand_path("../../config/environment", __FILE__) 
require 'rspec/rails' 
require 'rspec/autorun' 

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f} 

RSpec.configure do |config| 
    config.include Devise::TestHelpers, :type => :controller 
    config.extend ControllerMacros, :type => :controller 
    config.fixture_path = "#{::Rails.root}/spec/fixtures" 
    config.use_transactional_fixtures = true 
    config.infer_base_class_for_anonymous_controllers = false 
end 

spec/support/controller_macros.rb:

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

spec/Controller /test.rb:

require 'spec_helper' 
describe ProjectsController do 
    def valid_attributes 
    { 
    :name   => 'Project', 
    :description => 'Description' 
    } 
    end 

    def valid_session 
    {} 
    end 

    describe "Test" do 

    login_user 

    it "assigns all projects as @projects" do 
     # test passes if the following line is here, otherwise fails 
     subject.current_user.should_not be_nil 

     project = Project.create! valid_attributes 
     get :index, {}, valid_session 
     assigns(:projects).should eq([project]) 
    end 
    end 
end 

app/controllers/projects_controller.rb (gerade aus dem Generator mit Ausnahme Zugabe eines vor Filter:

class ProjectsController < ApplicationController 

    before_filter :authenticate_user! 

    # GET /projects 
    # GET /projects.json 
    def index 
    @projects = Project.all 

    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @projects } 
    end 
    end 

    # GET /projects/1 
    # GET /projects/1.json 
    def show 
    @project = Project.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @project } 
    end 
    end 

    # GET /projects/new 
    # GET /projects/new.json 
    def new 
    @project = Project.new 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @project } 
    end 
    end 

    # GET /projects/1/edit 
    def edit 
    @project = Project.find(params[:id]) 
    end 

    # POST /projects 
    # POST /projects.json 
    def create 
    @project = Project.new(params[:project]) 

    respond_to do |format| 
     if @project.save 
     format.html { redirect_to @project, notice: 'Project was successfully created.' } 
     format.json { render json: @project, status: :created, location: @project } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /projects/1 
    # PUT /projects/1.json 
    def update 
    @project = Project.find(params[:id]) 

    respond_to do |format| 
     if @project.update_attributes(params[:project]) 
     format.html { redirect_to @project, notice: 'Project was successfully updated.' } 
     format.json { head :ok } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @project.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /projects/1 
    # DELETE /projects/1.json 
    def destroy 
    @project = Project.find(params[:id]) 
    @project.destroy 

    respond_to do |format| 
     format.html { redirect_to projects_url } 
     format.json { head :ok } 
    end 
    end 
end 

Warum der Test mit der Aufnahme von subject.current_user.should_not be_nil passieren wird, aber nicht, wenn es nicht im Preis enthalten?

+0

Wiki Link ist jetzt: https://github.com/plataformatec/devise/wiki/How- An: -Test-Controller-mit-Rails-3-und-4-% 28und-RSpec% 29 – littleforest

Antwort

20

Ich lief das gleiche Problem bei der folgenden the how-to you mention. Die Lösung besteht darin, Aufrufe an valid_session von jeder Anforderung zu entfernen, da es die Sitzungswerte außer Kraft setzt, die von dem sign_in-Helper festgelegt werden.

Es ist eigentlich in einem Code-Block in der gleichen dokumentiert, wie zu, ich habe es auch vermisst :(

+0

Sie haben meinen Tag gerettet –

+0

Mann, Sie sollten eine Medaille gewinnen! –

Verwandte Themen