【问题标题】:No route matches using rspec controller test使用 rspec 控制器测试没有路由匹配
【发布时间】:2018-02-11 16:15:09
【问题描述】:

我有以下路线:

config/routes.rb:

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

controllers/api/v1/users_controller.rb:

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

控制器规格在文件夹spec/controllers/api/v1/下。

spec/controllers/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=>"index", :controller=>"api/v1/users"}

请注意,它从某处“推断”api 部分,但我的路线如下:

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

我怎样才能让它工作?

【问题讨论】:

  • 旁注:最好使用RSpec.describe Api::V1::UsersController 而不是将其放入Api::V1 模块中。

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


【解决方案1】:

我相信这是因为您使用 Api::V1::UsersController 为测试命名空间,但您的路由是在 Api 的 范围 内定义的。这就是为什么你的路线不在/api

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

或者,您也可以保持原样,向您的v1_users_path 或运行rails routes(而不是:index)时的任何相应路径发出get 请求。

【讨论】:

  • 感谢您的回答...这很奇怪,因为如果我只是进入浏览器并点击http://localhost:3000/v1/users,它就可以正常工作。我在实际的路由配置中看不到任何问题。另外我正在处理 API,所以我不确定我是否有任何访问权限,比如帮助者 v1_users_path。
  • rails routes 为您输出了什么?
  • 输出:GET /v1/users(.:format) api/v1/users#index
  • 嗯,我刚刚建立了一个测试项目,其路由和控制器与您相同,并且测试通过了。您在测试中是否需要rails_helper?
  • 我刚刚做了一个新的rails项目,添加了rspec并更改了gist.github.com/SMaxOwok/cdee164d883e0828ae4932228bfd5b34下面的gist中的文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-23
相关资源
最近更新 更多