-1
我正在做一些简单的集成测试。我想测试用户控制器中的sold_items操作。我已经确认路由存在并通过从浏览器访问它返回json。但是,rspec告诉我路由不存在。请看下面,规格,错误和我的route.rb。谢谢!Rails/rspec,集成测试失败,“无路由匹配”,但路由确实存在
规格:
require 'rails_helper'
RSpec.describe UsersController, type: :controller do
describe "GET #items" do
it "returns http success" do
user = FactoryGirl.create(:user)
get "users/#{user.id}/sold_items"
expect(response).to have_http_status(:success)
end
end
end
失败消息:
1) UsersController GET #items returns http success
Failure/Error: get "users/#{user.id}/sold_items"
ActionController::UrlGenerationError:
No route matches {:action=>"users/10/sold_items", :controller=>"users"}
# ./spec/controllers/users_controller_spec.rb:8:in `block (3 levels) in <top (required)>'
的routes.rb
Rails.application.routes.draw do
resources :users
resources :items
get "users/:id/sold_items" => "users#sold_items"
EDIT
规格
require 'rails_helper'
RSpec.describe UsersController, type: :controller do
describe "GET #items" do
it "returns http success" do
user = FactoryGirl.create(:user)
get "users/:id/sold_items", id: user.id
expect(response).to have_http_status(:success)
end
end
end
失败消息
2) UsersController GET #items returns http success
Failure/Error: get "users/:id/sold_items", id: user.id
ActionController::UrlGenerationError:
No route matches {:action=>"users/:id/sold_items", :controller=>"users", :id=>"12"}
# ./spec/controllers/users_controller_spec.rb:8:in `block (3 levels) in <top (required)>'
EDIT.2 MarvC第二建议
需要 'rails_helper'
RSpec.describe UsersController, type: [:request, :controller] do
describe "GET #items" do
it "returns http success" do
user = FactoryGirl.create(:user)
get "https://stackoverflow.com/users/:id/sold_items", id: user.id
expect(response).to have_http_status(:success)
end
end
end
失败
看起来像用户.ID未正确这里传递
2) UsersController GET #items returns http success
Failure/Error: @sold_items = User.find(params[:id]).seller_items.sold
ActiveRecord::RecordNotFound:
Couldn't find User with 'id'=:id
# ./app/controllers/users_controller.rb:6:in `sold_items'
# ./spec/controllers/users_controller_spec.rb:8:in `block (3 levels) in <top (required)>'
一个解决办法: 当我使用字符串插值来传递user.id到它的工作原理网址...
require 'rails_helper'
RSpec.describe UsersController, type: [:request, :controller] do
describe "GET #items" do
it "returns http success" do
user = FactoryGirl.create(:user)
get "users/#{user.id}/sold_items", id: user.id
expect(response).to have_http_status(:success)
end
end
end
我实现了你从rails 4建议的语法,请参阅编辑。规范仍然失败,没有路由匹配错误 – matthewalexander
尝试添加':request':在'RSpec.describe UsersController,类型:[:request,:controller] do' – mrvncaragay
我能够使它与request:request一起工作。但是,我不得不使用字符串插值。请参阅Edit.2 – matthewalexander