2014-03-03 37 views
35

有下面的代碼:如何在Rails/RSpec中測試異常提升?

def index 
    @car_types = car_brand.car_types 
end 

def car_brand 
    CarBrand.find(params[:car_brand_id]) 
    rescue ActiveRecord::RecordNotFound 
     raise Errors::CarBrandNotFound.new 
end 

我想通過RSpec的測試它。我的代碼是:

it 'raises CarBrandNotFound exception' do 
    get :index, car_brand_id: 0 
    expect(response).to raise_error(Errors::CarBrandNotFound) 
end 

CarBrand與ID等於0不存在,因此我的控制器代碼引發的錯誤:: CarBrandNotFound,但我的測試代碼,告訴我,什麼也沒有提高。我該如何解決它?我錯了什麼?

回答

57

爲了規範錯誤處理,您的期望需要在塊上設置;評估一個對象不會產生錯誤。

所以,你想要做這樣的事情:

expect { 
    get :index, car_brand_id: 0 
}.to raise_error(Errors::CarBrandNotFound) 

詳見Expect error。儘管如此,我對你沒有得到任何異常冒泡到你的規格結果感到有點驚訝。

+0

它沒有幫助 – malcoauri

+0

@malcoauri再次使用更新的代碼進行測試。 –

+0

結果相同 – malcoauri

11

get :index將永遠不會引發異常 - 它會將某些方式的響應設置爲500錯誤,如真實服務器所做的那樣。

而是嘗試:

it 'raises CarBrandNotFound exception' do 
    controller.params[:car_brand_id] = 0 
    expect{ controller.car_brand }.to raise_error(Errors::CarBrandNotFound) 
end 
33

爲我工作的期望{}而不是指望()。

+0

值得指出的是,這樣可以解決問題,因爲{}語法會創建一個塊來監視給定的異常情況。當檢查一段代碼引發異常時,MiniTest具有相似的語法要求。 – Argus9

+0

這樣一個小小的改變。讓我磨一會兒車輪。謝謝你。 – josh