3
votes

I'm having a frustrating time with Rspec while working through the Ruby on Rails Learn by Example tutorial on 5.2.

I'm currently trying to test my routing using rspec and the tests always comes back as a failure even though I followed the steps in the tutorial correctly to the best of my knowledge and have verified that the routing works by manually checking and testing the routing myself.

For example, the layout_links_spec.rb looks like this:

require 'spec_helper'

describe "LayoutLinks" do

    it "should have a Home page at '/'" do
        get '/'
        response.should have_selector('title', :content => "Home")
    end

    it "should have a Contact page at '/contact'" do
        get '/contact'
        response.should have_selector('title', :content => "Contact")
    end

    it "should have an About page at '/about'" do
        get '/about'
        response.should have_selector('title', :content => "About")
    end

    it "should have a Help Page at '/help'" do
        get '/help'
        reponse.should have_selector('title', :content => "Help")
    end

end

And my routes looks like:

SampleApp::Application.routes.draw do
  match '/contact', :to => 'pages#contact'
  match '/about', :to => 'pages#about'
  match '/help', :to => 'pages#help'
  get "pages/home"
  get "pages/contact"
  get "pages/about"
  get "pages/help"

  root :to => 'pages#home'
end

Rspec returns this failure:

  5) LayoutLinks should have a Home page at '/'
     Failure/Error: get '/'
     ActionController::RoutingError:
       No route matches [GET] "/"
     # ./spec/requests/layout_links_spec.rb:6:in `block (2 levels) in <top (required)>'

  6) LayoutLinks should have a Contact page at '/contact'
     Failure/Error: get '/contact'
     ActionController::RoutingError:
       No route matches [GET] "/contact"
     # ./spec/requests/layout_links_spec.rb:11:in `block (2 levels) in <top (required)>'

  7) LayoutLinks should have an About page at '/about'
     Failure/Error: get '/about'
     ActionController::RoutingError:
       No route matches [GET] "/about"
     # ./spec/requests/layout_links_spec.rb:16:in `block (2 levels) in <top (required)>'

  8) LayoutLinks should have a Help Page at '/help'
     Failure/Error: get '/help'
     ActionController::RoutingError:
       No route matches [GET] "/help"
     # ./spec/requests/layout_links_spec.rb:21:in `block (2 levels) in <top (required)>'

I get a similar error with my pages_controller_spec.rb tests as well

  describe "GET 'home'" do
    it "should be successful" do
      get 'home'
      response.should be_success
    end

Gets this rspec error:

  1) PagesController GET 'home' should be successful
     Failure/Error: get 'home'
     ActionView::Template::Error:
       undefined local variable or method `root_path' for #<#<Class:0x00000103e8b210>:0x00000103e87de0>
     # ./app/views/layouts/_header.html.erb:3:in `_app_views_layouts__header_html_erb__1560745193027372362_2179584160'
     # ./app/views/layouts/application.html.erb:10:in `_app_views_layouts_application_html_erb__2627526215404316040_2176993080'
     # ./spec/controllers/pages_controller_spec.rb:15:in `block (3 levels) in <top (required)>'

I checked my code with the tutorial and it looks right. If I type in the url localhost:3000/home or /about etc, I get to the correct page which indicates that it must be routed correctly. I could just go forward with the tutorial, but I'd like to learn how to do TDD and use rspec in practice but I feel like I can't rely on rspec to do this...

1
If I remember rightly the Rails Tutorial uses Spork with RSpec - Did you restart the Spork Server after editing the routes file? Spork pre-loads the routes and needs to be restarted for changes to take effect.nmott
Late reply is late but... Thanks! That solved the issue! A couple of months after really trying to grasp BDD/TDD and Rspec, I've come to love it. It's actually pretty fun!Don O
You should look into Guard - it will automatically restart the spork server when key files change.nmott

1 Answers

2
votes

I had exactly the same issue and was getting close to throwing something.

Restarting Spork resolved the issue and all was well with the world again