2011-03-05 69 views
4

我想測試一下控制器操作是否在某些before_filter中沒有發生重定向時實際調用。由於控制器操作本身可能會執行重定向操作,因此我希望存儲操作以引發特定錯誤(SuccessfulActionError或類似操作),然後檢查該錯誤是否爲調用該方法的指示符。在Rspec控制器測試中存在存根控制器操作,但它仍然執行

因此,我增加了以下內容:

controller.stub!(:action).and_raise(SuccessfulActionError) 

它的工作原理莫名其妙,異常被引發,但該方法的實際代碼仍在執行(例如,如果我在的的ID發送不存在記錄到'show'動作,它會拋出一個ActiveRecord :: RecordNotFound異常)。

這是爲什麼?我想完全殘留的行動,如果它被實施爲

def action 
    raise SuccessfulActionError 
end 

我做錯了什麼?這是錯誤的方法?

編輯:

使用

controller.should_receive(:action) 

也不起作用。

我覆蓋在這樣的before_all過濾器來解決未從ApplicationController中拿起default_url_options:

class MyController 
    def default_url_options(options = {}) 
    { :locale => params[:locale] } 
    end 
end 

莫非是罪魁禍首?當我不幸地移除它時,規格根本無法使用。

+1

我有同樣的問題在http://stackoverflow.com/questions/5881459/how-to-test-that-a-before-filter-works-correctly-with-rspec-in-rails,有你找到了解決方案嗎? – Kostas 2011-05-04 09:52:35

回答

0

我不清楚在保存方法後如何得到ActiveRecord :: RecordNotFound異常。存根應該替換方法調用。

作爲一種替代方法,您可以考慮對動作設置消息期望值,例如,

controller.should_receive(:show) 
get :show 

如果before_filter阻止操作被調用,應該會失敗。

+0

感謝您的建議。我嘗試過,不幸的是有了一些結果... – 2011-03-10 15:16:48