2014-03-25 47 views
0

我以前有過asked this question,並且被導向了this question for an answer,它們可以處理特徵規格。使用來自Railscast的自定義異常處理時,RSpec控制器規格錯誤地失敗#53

但是,如果在控制器規範中包含此錯誤,我仍遇到ActiveRecord :: RecordNotFound錯誤的規範失敗。例如,項目#new和項目#創建操作應該需要參數:list_id。 (我會使用嵌套路由:lists/:list_id/items/new。)如果沒有:list_id,則引發ActiveRecord :: RecordNotFound,因爲它無法加載@list。 custom exception handling會導致重定向到自定義錯誤#404。不過,我有這樣的一個控制器規格:

# /spec/controllers/items_controller_spec.rb 
describe "list_id param is missing" do 
    { new: :get, create: :post }.each do |action, method| 
    it "Redirects to the custom 404" do 
     send(method, action) 
     # need something here to test that it ultimately ends up at the custom 404 page. 
    end 
    end 
end 

# /config/environments/test.rb 
config.consider_all_requests_local  = false 
config.action_controller.perform_caching = false 

在這種正確重定向到404。然而測試正確的瀏覽器失敗:

Failure/Error: send(method, action) 
ActiveRecord::RecordNotFound: 
    Couldn't find List without an ID 

正如我聯繫上述其他問題提到,功能規格工作正常,但我怎樣才能得到這個控制器規格的工作? (軌道4的應用程序)

UPDATE:一些控制器代碼:

# /app/controllers/items_controller.rb 
before_action :set_list, only: [:new, :create] 

def new 
    @item = @list.items.build 
end 

private 

def set_list 
    @list = current_user.lists.find(params[:list_id]) 
end 

回答

0

控制器規格是不同的,但。我沒有實現你正在做的方式(我不知道它是否正確)。通常情況下,您隔離每個單例的測試,即GET,POST請求。試試看看問題是否仍然存在?

+0

我看到'{...} .each do | action,method | ...在MEAP的Rails 4 in Action書中的模式。我試着隔離只是'描述'GET新的''測試和相同的結果:( – robertwbradford

+0

錯誤清楚地表明你沒有將ID傳遞到'find'動作,所以你可能想弄清楚如何做到這一點。可能是語法錯誤 – kasperite

+0

這就是我試圖用這個測試 - 當List無法加載,因爲:list_id param丟失時會發生什麼:)在列表上有一個before_action#嘗試分配列表的新操作目的。我想測試一下:list_id param丟失時用戶將被重定向到404。 (我添加了一些控制器代碼。) – robertwbradford