Question

I'm a Rails newbie working my way through Michael Hartl's latest Rails Tutorial. I'm running Ruby 2.0.1 and Rails 4.0.

When testing for Authentication my Rspec returns the following errors.

I apologize in advance if my post is not detailed enough, please let me know if there is anything else I can include to help crack this problem.

I appreciate everyones time.

Thanks!

Failures:

1) Authentication with valid information 
 Failure/Error: it { should have_title(user.name) }
   expected #has_title?("John Smith") to return true, got false
 # ./spec/requests/authentication_pages_spec.rb:25:in `block (3 levels) in <top (required)>'

2) Authentication with valid information 
 Failure/Error: it { should have_link('Sign out',    href: signout_path) }
   expected #has_link?("Sign out", {:href=>"/signout"}) to return true, got false
 # ./spec/requests/authentication_pages_spec.rb:27:in `block (3 levels) in <top (required)>'

3) Authentication with valid information 
 Failure/Error: it { should have_link('Profile',     href: user_path(user), visible: false) }
   expected #has_link?("Profile", {:href=>"/users/1", :visible=>false}) to return true, got    false
 # ./spec/requests/authentication_pages_spec.rb:26:in `block (3 levels) in <top (required)>'

authentication_pages_spec.rb

require 'spec_helper'

describe "Authentication" do
  subject { page }
  describe "signin page" do
    before { visit signin_path }
    it { should have_content('Sign in') }
    it { should have_title('Sign in') }
  end
  describe "signin" do
      before { visit signin_path }
      describe "with invalid information" do
        before { click_button "Sign in" }
        it { should have_title('Sign in') }
        it { should have_selector('div.alert.alert-error', text: 'Invalid') }
      end
  end
   describe "with valid information" do
          let(:user) { FactoryGirl.create(:user) }
          before do
            visit signin_path
            fill_in "Email",    with: user.email.upcase
            fill_in "Password", with: user.password
          end
          it { should have_title(user.name) }
          it { should have_link('Profile',     href: user_path(user), visible: false) }
          it { should have_link('Sign out',    href: signout_path) }
          it { should_not have_link('Sign in', href: signin_path) }
    end
end

sessions_controlloer.rb

class SessionsController < ApplicationController

  def new
  end

  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      sign_in user
      redirect_back_or user
    else
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    end
  end

  def destroy
  end
end

views/session/new.html.erb

<% provide(:title, "Sign in") %>
<h1>Sign in</h1>

<div class="row">
  <div class="span6 offset3">
    <%= form_for(:session, url: sessions_path) do |f| %>

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

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

      <%= f.submit "Sign in", class: "btn btn-large btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>

routes.rb

SampleApp::Application.routes.draw do
  resources :users x
  resources :sessions,      only: [:new, :create, :destroy]
  root to: 'static_pages#home'
  match '/signup',  to: 'users#new',            via: 'get'
  match '/signin',  to: 'sessions#new',         via: 'get'
  match '/signout', to: 'sessions#destroy',     via: 'delete'
  match '/help',    to: 'static_pages#help',    via: 'get'
  match '/about',   to: 'static_pages#about',   via: 'get'
  match '/contact', to: 'static_pages#contact', via: 'get'

  # The priority is based upon order of creation: first created -> highest priority.
  # See how all your routes lay out with "rake routes".

  # You can have the root of your site routed with "root"
  # root to: 'welcome#index'

  # Example of regular route:
  #   get 'products/:id' => 'catalog#view'

  # Example of named route that can be invoked with purchase_url(id: product.id)
  #   get 'products/:id/purchase' => 'catalog#purchase', as: :purchase

  # Example resource route (maps HTTP verbs to controller actions automatically):
  #   resources :products

  # Example resource route with options:
  #   resources :products do
  #     member do
  #       get 'short'
  #       post 'toggle'
  #     end
  #
  #     collection do
  #       get 'sold'
  #     end
  #   end

  # Example resource route with sub-resources:
  #   resources :products do
  #     resources :comments, :sales
  #     resource :seller
  #   end

  # Example resource route with more complex sub-resources:
  #   resources :products do
  #     resources :comments
  #     resources :sales do
  #       get 'recent', on: :collection
  #     end
  #   end

  # Example resource route within a namespace:
  #   namespace :admin do
  #     # Directs /admin/products/* to Admin::ProductsController
  #     # (app/controllers/admin/products_controller.rb)
  #     resources :products
  #   end
end

-----------------------------------------------------------------------------------------------

Thanks I really appreciate your answer. After adding the click_button "Sign in" line I began to receive the following errors when I run Rspec.

Failures:

  1) Authentication with valid information 
     Failure/Error: click_button "Sign in"
     ActionView::MissingTemplate:
       Missing template sessions/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in:
         * "/Users/Ladarris/rails_projects/sample_app/app/views"
     # ./spec/requests/authentication_pages_spec.rb:24:in `block (3 levels) in <top (required)>'

  2) Authentication with valid information 
     Failure/Error: click_button "Sign in"
     ActionView::MissingTemplate:
       Missing template sessions/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in:
         * "/Users/Ladarris/rails_projects/sample_app/app/views"
     # ./spec/requests/authentication_pages_spec.rb:24:in `block (3 levels) in <top (required)>'

  3) Authentication with valid information 
     Failure/Error: click_button "Sign in"
     ActionView::MissingTemplate:
       Missing template sessions/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in:
         * "/Users/Ladarris/rails_projects/sample_app/app/views"
     # ./spec/requests/authentication_pages_spec.rb:24:in `block (3 levels) in <top (required)>'

  4) Authentication with valid information 
     Failure/Error: click_button "Sign in"
     ActionView::MissingTemplate:
       Missing template sessions/create, application/create with {:locale=>[:en], :formats=>[:html], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee]}. Searched in:
         * "/Users/Ladarris/rails_projects/sample_app/app/views"
     # ./spec/requests/authentication_pages_spec.rb:24:in `block (3 levels) in <top (required)>'
Was it helpful?

Solution

After you fill in email and password, you also need to click that button in "with valid infomration" example so the form is submitted and the next page is rendered.

describe "with valid information" do
      let(:user) { FactoryGirl.create(:user) }
      before do
        visit signin_path
        fill_in "Email",    with: user.email.upcase
        fill_in "Password", with: user.password
        click_button "Sign in"   # <------------------- Add this line
      end
      it { should have_title(user.name) }
      it { should have_link('Profile',     href: user_path(user), visible: false) }
      it { should have_link('Sign out',    href: signout_path) }
      it { should_not have_link('Sign in', href: signin_path) }
end 
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top