我以前有過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
我看到'{...} .each do | action,method | ...在MEAP的Rails 4 in Action書中的模式。我試着隔離只是'描述'GET新的''測試和相同的結果:( – robertwbradford
錯誤清楚地表明你沒有將ID傳遞到'find'動作,所以你可能想弄清楚如何做到這一點。可能是語法錯誤 – kasperite
這就是我試圖用這個測試 - 當List無法加載,因爲:list_id param丟失時會發生什麼:)在列表上有一個before_action#嘗試分配列表的新操作目的。我想測試一下:list_id param丟失時用戶將被重定向到404。 (我添加了一些控制器代碼。) – robertwbradford