在测试中找不到Rails路由

时间:2014-12-24 14:36:46

标签: ruby-on-rails unit-testing testing ruby-on-rails-4 tdd

此应用程序是一个Rails 4应用程序,只是一个API(此时)。我可以从浏览器中点击我的URL,但是当我尝试在测试中访问它时,它无法找到该URL。我明白了:

No route matches {:action=>"/api/v1/users/20", :controller=>"api/v1/users"}

我的测试中还没有任何断言。只是试图先解决这个错误:

# /spec/controllers/api/v1/users_controller_spec.rb
require 'rails_helper'

RSpec.describe Api::V1::UsersController, :type => :controller do
  describe "User API" do
    it "can return a user by ID" do
      user = FactoryGirl.create(:user)

      get "/api/v1/users/#{user.id}"
    end
  end
end

我的控制员:

# app/controllers/api/v1/users_controller.rb
class Api::V1::UsersController < ApplicationController
  before_action :set_user, only: [:show]

  def show 
  end

  private

  def set_user
    @user = User.find(params[:id])
  end
end

我的任何路线:

# config/routes.rb
Rails.application.routes.draw do
  namespace :api, defaults: {format: 'json'} do
    namespace :v1 do
      resources :users, only: [:show]
    end
  end
end

rake routes给我:

     Prefix Verb URI Pattern                 Controller#Action
api_v1_user GET  /api/v1/users/:id(.:format) api/v1/users#show {:format=>"json"}

我的宝石:

group :test do
  gem 'capybara'
end

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'database_cleaner'
end

我确信这里有一些简单的东西,但我已经花了几个小时而无法理解。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用Capybara的访问方法而不是get。在 /spec/controllers/api/v1/users_controller_spec.rb

require 'rails_helper'
require 'capybara' # unless you're already doing this in spec_helper.rb

RSpec.describe Api::V1::UsersController, :type => :controller do
  describe "User API" do
    it "can return a user by ID" do
      user = FactoryGirl.create(:user)

      visit "/api/v1/users/#{user.id}"
    end
  end
end

答案 1 :(得分:0)

我想我终于在某种程度上想到了这一点。我认为因为这是一个单元测试,我需要传递get操作名称而不是URL。现在我有了它并且它正在工作:

RSpec.describe Api::V1::UsersController, :type => :controller do
  describe "User API" do
    it "can return a user by ID" do
      user = FactoryGirl.create(:user)

      # get "/api/v1/users/#{user.id}"       # This failed.
      get :show, id: user.id, format: 'json' # This works!

    end
  end
end

我确实想测试以确保网址没有变化。我想这更像是集成测试,所以我想我可能会在features目录中这样做,并按照@NickM提到的方式进行。

更新

我正在撰写API应用。修复上述内容后,我遇到missing template错误。我不得不将get方法更改为格式参数。