2013-01-19 256 views
0

我是新來RSpec測試,我真的很感謝你的幫助。RSpec控制器測試

這是我在控制器中的索引操作,我需要對它進行測試以查看視圖內部的鏈接選擇是否按照它們應該的那樣操作。我會很感激你能提供給我的任何代碼,因爲我甚至不知道從哪裏開始。

def index 
respond_to do |format| 
    format.html 
    format.json do 
    if params[:s_id].blank? && !params[:f_id].blank? 
     @fp_for_dropdown = Model.where(:f_id => params[:f_id]) 
    elsif !params[:s_id].blank? && params[:f_id].blank? 
     @fp_for_dropdown = Model.where(:s_id => params[:s_id]) 
    elsif !params[:s_id].blank? && !params[:f_id].blank? 
     @fp_for_dropdown = Model.where(:s_id => params[:s_id], :f_id => params[:f_id]) 
    else 
     @fp_for_dropdown = Hash[] 
    end 
    render :json => Hash["" => ""].merge(Hash[@fp_for_dropdown.map { |i| [i.id, i.name] }]) 
    end 
end 

回答

0

一種方法解決這個問題是想你的控制器測試,單元測試。這意味着嘲笑對Model的調用以確保調用正確的調用。

describe SomeController do 
    it 'should retrieve by s_id only' do 
    Model.should_receive(:where).with(:s_id => 'abc') 
    get :index, :s_id => 'abc' 
    end 
    it 'should retrieve by f_id only' do 
    Model.should_receive(:where).with(:f_id => 'abc') 
    get :index, :f_id => 'abc' 
    end 
    it 'should retrieve by f_id and s_id' do 
    Model.should_receive(:where).with(:f_id => 'abc', :s_id => '123') 
    get :index, :f_id => 'abc', :s_id => '123' 
    end 
    it 'should not hit the database without f_id or s_id' do 
    Model.should_not_receive(:where) 
    get :index 
    end 
end 

如果你想獲得幻想,你也可以測試響應JSON:

it 'should retrieve by f_id only' do 
    Model.should_receive(:where).with(:f_id => 'abc').and_return(OpenStruct.new(id: 'abc', name: '123')) 
    get :index, :f_id => 'abc' 
    JSON.parse(response.body).should == {} # INCOMPLETE, fill in response to expect 
end 

不幸的是,我無法完成的響應檢查,因爲我不知道你是用做什麼哈希在這一行:

render :json => Hash["" => ""].merge(Hash[@fp_for_dropdown.map { |i| [i.id, i.name] }]) 

看看jbuilderrabl爲建設有意見JSON響應。

+0

非常感謝! – user1993565

+0

不客氣:) –

0

有一個很好的理由,這些查詢都是很難在不屬於他們有一個controller--測試。相反,最好將它們轉移到您的模型上的任何一種課程方法或scopes,然後再通過控制器調用。然後你可以編寫普通的RSpec model specs

請參見:How to test scopes?

+0

我知道它會更好,但由於某種原因,我正在使用的代碼已經在控制器中,所以我現在就要這樣離開它。感謝您的鏈接,請仔細閱讀。 – user1993565