Routing & Request Errors - no route matches

1,263 views
Skip to first unread message

Gabriel Zangerl

unread,
Jan 16, 2017, 5:28:37 PM1/16/17
to rspec
Hi everyone,

I'm having an Rails 5 --api with Rspec (core) 3.5.4.
The API is working under the subdomain api.mywebsite.com.
The Controllers are in an api module and a v1 namespace.

Routes look like this:
...
  constraints subdomain
: 'api' do
   scope module: 'api' do

      # API v1
     namespace :v1 do
       resources :users, except: :edit
     
end

   
end
end


Controllers are lying at app/controllers/api/v1 like the UsersController.rb:
module Api::V1
  class UsersController < ApplicationController
    def my_methods
      ...
    end
  end
end

In the spec/routing/users_routing.rb I have got e.g.:
require "rails_helper"

RSpec.describe Api::V1::UsersController, type: :routing do
  describe "routing" do
        it "routes to #index" do
      expect(:get => "/users").to route_to("api/v1/users#index")
    end
  end
end

But when I call rails spec in the console, I get multiple errors like:
Api::V1::UsersController routing routes to #index
      Failure/Error: expect(:get => "/users").to route_to("users#index")
        No route matches "/users"
      # ./spec/routing/users_routing_spec.rb:8:in `block (3 levels) in <top (required)>'

Can someone help me here?
Am I missing something??

Thx.

Jon Rowe

unread,
Jan 16, 2017, 5:36:24 PM1/16/17
to rs...@googlegroups.com
I believe you need to use the full `expect(get(‘/users’, :subdomain => ‘api’)).to route_to("api/v1/users#index”)` to make this work, as RSpec can’t guess the constraint for you.

Jon Rowe
---------------------------

--
You received this message because you are subscribed to the Google Groups "rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rspec+un...@googlegroups.com.
To post to this group, send email to rs...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/rspec/823c800d-15c8-40a1-a143-5e77a8e27d29%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Xavier Shay

unread,
Jan 16, 2017, 5:37:29 PM1/16/17
to rs...@googlegroups.com
I don't really know much about this, but I think you need to include the v1 namespace in the spec per https://www.relishapp.com/rspec/rspec-rails/docs/routing-specs/route-to-matcher#route-spec-for-a-namespaced-route-with-shortcut-specifier

expect(:get => "/v1/users").to route_to("api/v1/users#index")

Gabriel Zangerl

unread,
Jan 16, 2017, 5:49:41 PM1/16/17
to rspec
Hey, thx for your answer, but I'm still getting an error
Api::V1::UsersController routing routes to #index
     Failure/Error: expect(:get => "/users", :subdomain => 'api').to route_to("api/v1/users#index")
       No route matches "/users"

I also tried an other route with /v1/users but thats the same thing:
Api::V1::UsersController routing routes to #index
      Failure/Error: expect(:get => "/v1/users", :subdomain => 'api').to route_to("api/v1/users#index")
        No route matches "/v1/users"
      # ./spec/routing/users_routing_spec.rb:8:in `block (3 levels) in <top (required)>'

Jon Rowe

unread,
Jan 16, 2017, 6:20:29 PM1/16/17
to rs...@googlegroups.com
Yeah I don’t think you can specify params with the hash syntax, you’ll need to use the method.

Jon Rowe
---------------------------

Gabriel Zangerl

unread,
Jan 16, 2017, 6:38:06 PM1/16/17
to rspec
which method?

Jon Rowe

unread,
Jan 16, 2017, 8:01:37 PM1/16/17
to rs...@googlegroups.com
`get(path, options)`

Jon Rowe
---------------------------

Vinney Cavallo

unread,
Oct 19, 2018, 2:10:37 PM10/19/18
to rspec
Hi Gabo,

did you ever arrive at a solution to this? I'm having the same issue using `type: :request`, `type: :controller` works ok, but when using request specs (and using a module namespace) rspec can't seem to figure out the routing/controller. the literally identical uri works just fine in a browser, curl, etc.
driving me nuts!

Vinney Cavallo

unread,
Oct 19, 2018, 2:34:34 PM10/19/18
to rs...@googlegroups.com
I solved my own problem. Posting it here for others:
I have constraints on my API, and without the proper headers the endpoints aren't found (by design) - I wasn't including the correct headers in the spec. Checking `rails routes` and trying with controller specs didn't surface this because they don't aren't traversing the full routing structure the same as a request spec (I think). This is a good reason to use request specs! In this case the failing test was actually very nicely mirroring reality :D

Reply all
Reply to author
Forward
0 new messages