2014-01-23 74 views
0

編寫Rspec控制器測試,但試圖忽略某些方法,即通過API(例如Mail Chimp或Google Drive)實際上將某些內容發佈到第三方的方法。控制器測試,忽略某個動作中的某些方法

例如我的控制器代碼:

def create 
@request = Request.new(request_params) 
if @request.save 
    flash[:success] = true 
    @request.save_spreadsheet 
    RequestMailer.confirmation_email(@request, request.host_with_port).deliver 
    redirect_to edit_request_path(@request.edit_id) 
else 
    render 'new' 
end 
end 

哪裏save_spreadsheet是保存到谷歌電子表格的方法。當我測試控制器,比如像這樣:

describe "POST create - with valid data" do 
    it "creates a new request" do 
     expect{ 
      post :create, request: FactoryGirl.attributes_for(:request) 
     }.to change(Request,:count).by(1) 
    end 
end 

我想測試控制器,但並非FactoryGirl數據保存到電子表格,這是目前正在發生的事情。任何想法如何做到這一點?

回答

0

您可以存根方法以確保它被調用。

expect(RequestMailer).to receive(:confirmation_email).with(anything) 
post :create, request: FactoryGirl.attributes_for(:request) 

上面的例子假設任何參數,也可以內with指定它們。

+0

哇好,謝謝,我非常新的這個存根概念。看看@pbrisbin在下面寫的是什麼,好像我需要做一些其他的聲明和存根,並且不能夠完全正確地複製上面的代碼? – james

+0

我不這麼認爲。你在做什麼是控制器測試。控制器測試是一種功能測試,但不是單元測試,所以完全可以接受其他應用程序。在這個例子中,你只需要確保RequestMailer能夠正確調用。這僅僅是一個例子。對於其他事情你可以寫其他測試。 –

+0

好吧,這是有道理的,但我遇到的另一個問題是調用save_spreadsheet方法,所以我需要將它存根。如果我從你的代碼推斷,我可以寫一些像expect(GoogleDrive).to接收(:save_spreadsheet).with(任何東西)的東西;發佈:創建,請求...? – james

0

你需要對很多東西進行存根,這可能是一種嗅覺 - 所以首先考慮如何編寫這個測試可以變得更容易,以及什麼樣的實現會使你去。

如果你想測試這個實現的,是,你需要沿着這些路線的東西:

params = { ... } 
request = Request.new(params) 
request.stub(:save_spreadsheet) 
Request.stub(:new).with(params).and_return(request) 
mailer = double("Mailer") 
mailer.stub(:deliver) 
RequestMailer.stub(:confirmation_email).with(request, ...).and_return(mailer) 

expect { post :create, request: params }.to change(Request, :count).by(1) 
+0

謝謝!所以我很好奇,好像殘片意味着我不能使用FactoryGirl。那是對的嗎?或者我還可以寫一些像FactoryGirl.build(:request)?對不起,我剛剛瞭解到了殘肢。這條線試圖做什麼? Request.stub(:new).with(params).and_return(request) – james

+0

Mocks/Stubs和Factories是兩個獨立的概念,隨時可以谷歌他們。 Factory是一個創建其他對象的對象(比如User factory會通過create(:user)'創建一個User實例)。工廠是FactoryGirl提供的。Mock/Stub是一個對象,用於知道如何回答特定方法的其他對象(如user = double(「User」,save:true)')。 Mock有一個期望,一個方法將會被調用,而一個存根就像一些鴨子一樣嘎嘎,但是如果不被要求嘎嘎叫就不會叫嚷。 – pbrisbin

+0

'Request.stub(:new).with(params).and_return(request)'告訴'Request'對象,如果用'params'調用'new',它應該返回'request'對象。有了這個存根,你的實現代碼中的'@ request'將是你在測試中定義的'request' - 這可以讓你設置更多的期望,特別是使'save_spreadsheet'成爲一個空操作符。 – pbrisbin