2016-07-15 59 views
-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 

回答

1

看来你的语法是错的。

变化: get "users/#{user.id}/sold_items"

到:

导轨4

get "users/:id/sold_items", id: user.id

导轨5
get "users/:id/sold_items", params: { id: user.id }

+0

我实现了你从rails 4建议的语法,请参阅编辑。规范仍然失败,没有路由匹配错误 – matthewalexander

+0

尝试添加':request':在'RSpec.describe UsersController,类型:[:request,:controller] do' – mrvncaragay

+0

我能够使它与request:request一起工作。但是,我不得不使用字符串插值。请参阅Edit.2 – matthewalexander