0
votes

I've written a test to test the 404 page

pages_controller_spec.rb

RSpec.describe PagesController, type: :controller do
  before :all do
    Rails.application.config.action_dispatch.show_exceptions = true
    Rails.application.config.consider_all_request_local = false
  end

  describe "status 404" do
    it "respond with 404 if page is not found" do
      get :help, params: { id: "foobar" }
      expect(response.status).to eq(404)
    end
  end
end

The pages controller is simple and functions to render the static pages "/help" and "/about"

class PagesController < ApplicationController
  def help
  end

  def about
  end
end

The error handling is set up as follows

application_controller.rb

 def not_found
   raise ActionController::RoutingError.new("Not Found")
 rescue
   render_404
 end

 def render_404
   render file: "#{Rails.root}/public/404", status: :not_found
 end

The test result is

expected: 404
            got: 200

Which I do not understand since "/help/foobar" does render the 404 page when I try it myself in the browser. I guess the problem could be that my "get" action in the test is formatted wrong but I'm not sure.

EDIT

config/routes.rb as requested

  get "/about", to: "pages#about"
  get "/help", to: "pages#help"

EDIT 2

Updated the test with the syntax from https://relishapp.com/rspec/rspec-rails/v/3-4/docs/routing-specs/route-to-matcher

The test now looks like this

RSpec.describe PagesController, type: :controller do
  before :all do
    Rails.application.config.action_dispatch.show_exceptions = true
    Rails.application.config.consider_all_request_local = false
  end

  describe "status 404" do
    it "respond with 404 if page is not found" do
      expect(get("/foobar")).to route_to("application#not_found")
    end
  end
end

Unfortuenly this raises another error

ActionController::UrlGenerationError:
 No route matches {:action=>"/foobar", :controller=>"pages"}

No route is matching which is kind of the point but the "not_found" method is being used for some reason

1

1 Answers

0
votes

Change your routes to make your call work from the browser:

get "/help/:id", to: "pages#help"

If the test returns a 200, it's because it calls directly the help method from your controller without using the config/routes.rb file.

EDIT

Here is how you test your routing: https://relishapp.com/rspec/rspec-rails/v/3-4/docs/routing-specs/route-to-matcher