2012-04-10 42 views
1

在控制器測試Rspec的,如何控制

def admin_search 
    @admins = User.find(:all,:joins=>[:roles],:conditions=>["name IN (?) and email like '#{params[:email]}%'",["content team","ops team"]]).paginate(:page => params[:page], :per_page => 10) 
end 

請建議我在rspec的

回答

2

首先是一些代碼,這是更好地提取find(:all, ...)調用用戶模型。例如,稱它爲search

class User < ActiveRecord::Base 
    scope :search_by_email, lambda { |email| 
    joins(:roles).where(["name IN (?) and email like '#{email}%'",["content team","ops team"]]) 
    } 
end 

使用它的控制器則:

def admin_search 
    @admins = User.search_by_email(params[:email]).paginate(:page => params[:page], :per_page => 10) 
end 

現在,你可以在隔離測試search_by_email方法 - 檢查,這對「內容團隊」和「運營團隊」只返回結果,正確使用空電子郵件字符串等等。

我不認爲你必須測試paginate方法,因爲它應該已經在kaminari,will_paginate或任何你使用的測試。但是如果你想確定它是否被調用,那麼你可以在控制器規格中使用模擬期望(should_receive)。

編輯:怎樣的規格可能看起來像

describe User do 
    describe ".search_by_email" do 
    let(:content_team) { Role.create! name: "content team" } 
    let(:ops_team)  { Role.create! name: "ops team"  } 
    let(:another_team) { Role.create! name: "another team" } 

    it "should search in content team" do 
     content_team_user = User.create! email: "[email protected]", roles: [content_team] 
     User.search_by_email("black").should == [content_team_user] 
    end 

    it "should search in ops team" do 
     ops_team_user = User.create! email: "[email protected]", roles: [ops_team] 
     User.search_by_email("black").should == [ops_team_user] 
    end 

    it "should not search in other teams" do 
     other_team_user = User.create! email: "[email protected]", roles: [another_team] 
     User.search_by_email("black").should == [] 
    end 

    it "should not search by empty string" do 
     content_team_user = User.create! email: "[email protected]", roles: [content_team_user] 
     User.search_by_email("").should == [] 
     User.search_by_email(nil).should == [] 
    end 

    # more specs for search... 
    end 
end 


describe UsersController do 
    describe "admin search" do 
    let(:admin_user) { double(:admin_user).as_null_object } 
    let(:search_string) { 'joe' } 

    it "should search for admin users" do 
     User.should_receive(:search_by_email).with(search_string).and_return([admin_user]) 
     get :admin_search, email: search_string 
     assigns(:admins).should == [admin_user] 
    end 
    end 
end 
+0

我是新的RSpec的來寫,u能告訴我怎麼寫rspec的 – Swathi 2012-04-10 13:07:59

+0

好吧,我會更新我的答案 – cutalion 2012-04-11 01:09:40