2015-03-23 1 views
0

Je suis suit le long du processus d'authentification de ce tutoriel - actuellement sur la section 'Authentification utilisateur':Rspec & Capybara: uninitialized SessionController constante

http://larsgebhardt.de/user-authentication-with-ruby-on-rails-rspec-and-capybara/

J'ai reçu l'échec du test suiveur:

1) User Management User log in 
    Failure/Error: login(@writer) 
    ActionController::RoutingError: 
     uninitialized constant SessionController 
    # ./spec/support/user_helper.rb:6:in `login' 
    # ./spec/features/users_spec.rb:27:in `block (2 levels) in <top (required)>' 

Voici la mention du fichier d'aide et de test spécifique dans le message d'échec, ainsi que d'autres fichiers.

spec/features/users_spec.rb

require 'spec_helper' 

    background do 
     @writer = create(:user, :writer) 
    end 

    .... 

    scenario 'User log in' do 
     activate(@writer) 
     login(@writer) 
     expect(page).to have_content "Successfully logged in." 
    end 

spec/support/user_helper.rb

module UserHelper 


    def login(a) 
    visit root_path 
    click_link 'Log In' 
    fill_in 'session[email]', with: a.email 
    fill_in 'session[password]', with: a.password 
    click_button 'Log In' 
    end 

    def logout(a) 
    visit root_path 
    click_link 'Log Out' 
    end 

    def activate(a) 
    visit activate_path(:code => a.activation_code) 
    end 

end 

routes.rb

resources :session 

sessions_controller.rb

class SessionsController < ApplicationController 


    def new 
    end 

    def create 
    user = User.find_by_email(params[:session][:email]).try(:authenticate, params[:session][:password]) 
    if user 
     if user.is_active? 
      session[:user_id] = user.id 
      redirect_to (session[:target_url] || root_path) 
       flash[:notice] = "Successfully logged in." 
      else 
       redirect_to new_session_path 
       flash[:error] = "Account inactive. Please activate your account." 
      end 
     else 
      redirect_to new_session_path 
      flash[:error] = "Invalid email or password." 
     end 
    end 

    def destroy 
    session[:user_id] = nil 
    redirect_to root_path 
    flash[:notice] = "Successfully logged out." 
    end 

end 

new.html.erb

<h1>Log In</h1> 

<%= form_for :session, url: sessions_path do |f| %> 

    <div> 
     <%= f.label :email %> 
     <%= f.text_field :email %> 
    </div> 

    <div> 
     <%= f.label :password %> 
     <%= f.password_field :password %> 
    </div> 

    <div> 
     <%= f.submit 'Log In' %> 
    </div> 

<% end %> 

routes râteau

Prefix Verb URI Pattern         Controller#Action 
    profiles_show GET /profiles/show(.:format)     profiles#show 
    sessions_new GET /sessions/new(.:format)      sessions#new 
     users_new GET /users/new(.:format)      users#new 
      root GET /           sessions#new 
    post_comments GET /posts/:post_id/comments(.:format)   comments#index 
        POST /posts/:post_id/comments(.:format)   comments#create 
new_post_comment GET /posts/:post_id/comments/new(.:format)  comments#new 
edit_post_comment GET /posts/:post_id/comments/:id/edit(.:format) comments#edit 
    post_comment GET /posts/:post_id/comments/:id(.:format)  comments#show 
        PATCH /posts/:post_id/comments/:id(.:format)  comments#update 
        PUT /posts/:post_id/comments/:id(.:format)  comments#update 
        DELETE /posts/:post_id/comments/:id(.:format)  comments#destroy 
      posts GET /posts(.:format)       posts#index 
        POST /posts(.:format)       posts#create 
     new_post GET /posts/new(.:format)      posts#new 
     edit_post GET /posts/:id/edit(.:format)     posts#edit 
      post GET /posts/:id(.:format)      posts#show 
        PATCH /posts/:id(.:format)      posts#update 
        PUT /posts/:id(.:format)      posts#update 
        DELETE /posts/:id(.:format)      posts#destroy 
     sessions GET /sessions(.:format)       sessions#index 
        POST /sessions(.:format)       sessions#create 
     new_session GET /sessions/new(.:format)      sessions#new 
    edit_session GET /sessions/:id/edit(.:format)    sessions#edit 
      session GET /sessions/:id(.:format)      sessions#show 
        PATCH /sessions/:id(.:format)      sessions#update 
        PUT /sessions/:id(.:format)      sessions#update 
        DELETE /sessions/:id(.:format)      sessions#destroy 
      users GET /users(.:format)       users#index 
        POST /users(.:format)       users#create 
     new_user GET /users/new(.:format)      users#new 
     edit_user GET /users/:id/edit(.:format)     users#edit 
      user GET /users/:id(.:format)      users#show 
        PATCH /users/:id(.:format)      users#update 
        PUT /users/:id(.:format)      users#update 
        DELETE /users/:id(.:format)      users#destroy 
    profile_index GET /profile(.:format)       profile#index 
        POST /profile(.:format)       profile#create 
     new_profile GET /profile/new(.:format)      profile#new 
    edit_profile GET /profile/:id/edit(.:format)     profile#edit 
      profile GET /profile/:id(.:format)      profile#show 
        PATCH /profile/:id(.:format)      profile#update 
        PUT /profile/:id(.:format)      profile#update 
        DELETE /profile/:id(.:format)      profile#destroy 
     activate GET /activate/:code(.:format)     users#activate 

de _header.html.erb

<a href="#">About</a> 
<a href="#">Services</a> 
<a href="#"><%= link_to "Sign Up", new_user_path %></a> 
<a href="#"><%= link_to "Log In", new_session_path %></a> 
<a href="#"><%= link_to "Log Out", "/session", method: :delete %></a> 

J'avais déjà un problème avec la configuration du fichier d'aide de l'utilisateur qui a été résolu, mais Incase il devient pertinent, vous pouvez voir la réponse et de l'état du fichier de configuration ici:

Rspec email_spec issue

Répondre

1

Vous avez besoin resources :sessions, vous manquent les 's'.

Edit:

Vous utilisez la route suppression incorrecte, vous devez dire

<%= link_to "Log Out",session_path(pass the current signed in user here) , method: :delete %> 
+0

Merci pour la réponse. J'obtiens toujours cette erreur 'Echec/Erreur: login (@writer) ActionView :: Template :: Erreur: Aucune route ne correspond {: action =>" show ",: controller =>" sessions "} clés manquantes requises : [: id] '. Ce qui m'embrouille, c'est que je ne pensais pas avoir besoin d'une action de «show», c'est pourquoi l'auteur a supposé que la «session» de l'itinéraire était singulière. – shroy

+0

@Shroy as-tu défini une racine? Vous avez besoin de 'root 'sessions # new'" dans vos routes.rb –

+0

Ya ma racine définie est 'posts # index'. C'est un blog et j'essaye de créer un système d'authentification qui a un 'admin', un 'writers', et' des visiteurs 'qui peuvent seulement commenter. La page racine de l'utilisateur affiche tous les messages. – shroy