RspecRailsRouting
RSpec matchers for Rails routing.
Installation
Add this line to your application's Gemfile:
gem 'rspec-rails-routing'
And then execute:
$ bundle
Or install it yourself as:
$ gem install rspec-rails-routing
Usage
Create a routing spec helper. In this file you will define at least a host. You can add an addition level of indirection in order to have multiple hosts. This is useful when subdomains are used in your application and must be speced for different routing.
# spec/support/routing_spec_helper.rb
module RoutingSpecHelper
module Hosts
def host
some_application_host
end
def some_application_host
'http://www.some-application.test'
end
end
end
RSpec.configure do |config|
config.include RoutingSpecHelper::Hosts, :type => :routing
end
Write a routing spec.
# spec/routing/projects_routing_spec.rb
require 'spec_helper'
describe 'projects routing' do
let :args do
['projects', { :host => host }]
end
describe 'path recognition' do
it { should recognize_restful_index_path( *args ) }
it { should recognize_restful_show_path( *args ) }
it { should recognize_restful_new_path( *args ) }
it { should recognize_restful_edit_path( *args ) }
it { should recognize_restful_create_path( *args ) }
it { should recognize_restful_update_path( *args ) }
it { should_not recognize_restful_destory_path( *args ) }
end
describe 'path helpers' do
# using an open struct here as ActiveRecord models do not have an ID until saved to DB
let :project do
OpenStruct.new( id: 1 )
end
it { should have_named_route( :projects, "/projects" ) }
it { should have_named_route( :project, project, "/projects/#{project.id}" ) }
it { should have_named_route( :new_project, "/projects/new" ) }
it { should have_named_route( :edit_project, project, "/projects/#{project.id}/edit" ) }
# The create and update actions do not have path helpers as the paths are just the
# index and show paths with different HTTP Verbs.
end
end
Given the routes file.
# config/routes.rb
SomeApplication::Application.routes.draw do
resources :projects, :except => [:destroy]
end
The preceding spec will pass.