2013-04-24 44 views
0

使用Rspec,我試圖爲我的API創建一個控制器規範,以及請求規範。問題是我不明白在每個規範中測試的部分內容。什麼屬於控制器規範,屬於請求規範?

爲簡單起見,假設我的控制器看起來像如下:

class Api::V1::ItemsController < ApplicationController 
    def index 
    if params[:user_id] 
     user = User.find(params[:user_id]) 
     @items = user.items 
    else 
     @items = Item.all 
    end 
    end 
end 

它使用Rabl的渲染響應。

對於像這樣簡單的控制器,控制器規格是什麼樣的?請求規範是什麼樣的?在什麼時候驗證API響應JSON是我期望的?等等。

回答

1

對於控制器規範,你會設置mock來處理請求的認證。你只想測試一下,如果params[:user_id]通過,那麼@items被設置爲用戶項目,如果沒有,那麼所有項目。

對於請求規範,您將簡單地包含一些測試以驗證身份驗證過程。

如果你問我,我會在兩個測試中將api響應驗證爲json。

2

對於控制器的規格,我會寫測試是這樣的:

it "renders with a user_id" do 
    get :index, id: @user.id 
    assigns(:items).should == @user.items 
    response.should be_success 
    response.should render_template("index") 
end 

一爲user_id路徑,一個沒有。我給你設置@user;你可以使用Fixture或者FactoryGirl,在一個塊之前實例化一個,或者僅僅存根/模擬全部。如果可以的話,最好避免碰到數據庫。對於像Item.all和關聯這樣的事情可能會有點棘手,如果沒有殘留或堅持到測試數據庫,這些連接就更難。模擬和存根使得它變得容易,但是如果模型改變,也會讓你的測試變得更加脆弱。

對於請求規範,我會創造真正的數據庫對象,做這樣的事情,使用水豚:

it "lists all items without a user_id" do 
    visit foo_path 
    current_path.should == foo_path 
    page.should have_content(item1.name) 
    page.should have_content(item2.name) 
end 

..和與user_id路徑相似。不知道你的數據和你如何渲染它,我不能更具體。如果你使用JSON,你應該在這裏檢查整個JSON響應。儘管如此,我不會檢查控制器規範中的JSON響應;控制器的工作就是將數據轉移到正確的視圖。您也可以單獨測試視圖,然後在請求規範中測試整個端到端場景。