此应用程序是一个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
我确信这里有一些简单的东西,但我已经花了几个小时而无法理解。
答案 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
方法更改为格式参数。