使用rspec控制器测试没有路由匹配

时间:2017-09-03 02:54:28

标签: ruby-on-rails rspec ruby-on-rails-5 rspec-rails

我有以下路线:

配置/ routes.rb中:

Rails.application.routes.draw do
  scope module: :api do
    namespace :v1 do
      resources :users
    end
  end
end

控制器/ API / V1 / users_controller.rb:

module Api
  module V1
    class UsersController < ApplicationController
      def index
        ...
      end
    end
  end
end

控制器规格位于文件夹spec/controllers/api/v1/

规格/控制器/ API / V1 / users_controller_spec.rb:

module Api
  module V1
    RSpec.describe UsersController, type: :controller do
      let!(:users) { create_list(:user, 10) }

      describe 'GET /v1/users' do
        before { get :index }
        # Already tried `get '/v1/users'`, got the same error

        it 'should return 10 users' do
          expect(JSON.parse(response).size).to eq(10)
        end
      end
    end
  end
end

运行测试后,我收到以下错误:

  

的ActionController :: UrlGenerationError:   没有路线匹配{:action =&gt;&#34; index&#34;,:controller =&gt;&#34; api / v1 / users&#34;}

注意它&#34;推断&#34;来自某个地方的api 部分,但我的路线是这样的:

v1/users
v1/users/:id
...

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:1)

我认为这是因为您使用Api::V1::UsersController命名测试,但您的路线是在Api的范围中定义的。这就是您的路线不在/api

之下的原因

尝试从控制器中移除Api模块并测试或将scope module: :api更改为namespace :api

或者,您可以按原样保留所有内容并向get发出v1_users_path请求,或者在您rails routes时运行相应路径(而不是:index })。