2016-12-07 44 views
0

我有一個items_controller.rb我需要幫助寫在軌

def get_serialized_copy_of_item 
    @item= Item.find_by_id(params[:id]) 
    if @item.nil? 
     head :no_content 
    else 
     respond_to do |format| 
     serialized_item = @item.as_json(include: [:test1, :test2, :test3, :test4]) 
     format.html 
     format.json { render json: serialized_item } 
     end 
    end 
    end 

的routes.rb

namespace :items do 
    get '/get_serialized_copy_of_item/:id', to:'items#get_serialized_copy_of_item' 
end 

RSpec的測試我想寫一個rspec的測試

  1. 提交不正確的商品ID並確保返回204

我已經做了

require 'spec_helper' 

describe Items::ItemsController do 
    describe "GET items#get_serialized_copy_of_item" do 
    it "renders 204 status code" do 
     get "/items/get_serialized_copy_of_item/dfsdf" 
     expect(last_response.status).to eq(204) 
    end 
    end 
end 

錯誤:我收到路由錯誤

F 

Failures: 

    1) Items::ItemsController GET items#item renders 204 status code 
    Failure/Error: get "/items/get_serialized_copy_of_item/dfsdf" 
    ActionController::RoutingError: 
     No route matches {:controller=>"items/items", :action=>"/items/get_serialized_copy_of_item/dfsdf"} 
    # ./spec/controllers/items/items_controller_spec.rb:6:in `block (3 levels) in <top (required)>' 

Finished in 0.01576 seconds 
1 example, 1 failure 

Failed examples: 

rspec ./spec/controllers/items/items_controller_spec.rb:5 # Items::itemsController GET items#item renders 204 status code 

束EXEC耙路線

         GET `items/get_serialized_copy_of_item/:id(.:format)       items/items#get_serialized_copy_of_item` 

感謝

+0

可以請你'束EXEC耙routes'的輸出添加到您問題的結束? – sixty4bit

+0

@ sixty4bit新增。 – kavin

回答

3

RSpec的假設控制器名稱從名字的測試。注意this doc的例子:

describe WidgetsController do 
    describe "GET index" do 
    it "has a 200 status code" do 
     get :index 
     response.code.should eq("200") 
    end 
    end 
end 

這裏的RSpec已經知道,因爲describe WidgetsController路徑的widgets部分,所以get方法只需要:index作爲參數。

要翻譯,爲您的情況:

describe Items::ItemsController do 
    describe "GET get_serialized_copy_of_item" do 
    it "renders 204 status code" do 
     get :get_serialized_copy_of_item, id: 'sdf' 

     expect(response.status).to eq(204) 
    end 
    end 
end 
  1. 你只需要在動作的名稱傳遞給get()方法,而不是整個路徑。
  2. 您需要包括:id PARAM作爲第二個參數get()
  3. 好像namespace是錯誤的方式在這裏做路由。試着改變你的路由定義這樣的:
resources :items do 
    member do 
    get :get_serialized_copy 
    end 
end 

,這將產生以下路線:

➜ bundle exec rake routes 
    Prefix Verb URI Pattern  

    Controller#Action 
get_serialized_copy_item GET /items/:id/get_serialized_copy(.:format) items#get_serialized_copy 

爲此,您希望您的ItemsControllerapp/controllers/items_controller.rb

+0

我試過,但我得到同樣的錯誤。我也試過'描述ItemsController' – kavin

+0

這個答案對我來說是正確的。你仍然得到這個:'沒有路線匹配{:controller =>「items/items」,:action =>「/ items/get_serialized_copy_of_item/dfsdf」}'? –

+0

@JagdeepSingh,是'ActionController :: RoutingError: 沒有路由匹配{:id =>「sdf」,:controller =>「items/items」,:action =>「get_serialized_copy_of_item」} – kavin

0

從我所看到的沒有任何嵌套。

如果是這樣,您應該致電ItemsController而不是Items::ItemsController

items_controller_spec:

require 'spec_helper' 

describe ItemsController do 
    describe "GET #get_serialized_copy_of_item" do 
    it "renders 204 status code" do 
     get "/items/get_serialized_copy_of_item/dfsdf" 
     expect(last_response.status).to eq(204) 
    end 
    end 
end