web-dev-qa-db-ja.com

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

Idが0のCarBrandは存在しないため、コントローラーコードでErrors :: CarBrandNotFoundが発生しますが、テストコードでは何も発生していないことがわかります。どうすれば修正できますか?何が悪いの?

69
malcoauri

エラー処理を指定するには、ブロックに期待値を設定する必要があります。オブジェクトを評価してもエラーは発生しません。

だからあなたはこのようなことをしたい:

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

詳細については、 Expect error を参照してください。

ただし、スペックの結果に例外が発生しないことに少し驚いています。

94
Jakob S

expect()の代わりにexpect{}を使用します。

76
kaleb4eg

get :indexは決して例外を送出しません-実際のサーバーが行うように、応答を何らかの方法で500エラーに設定します。

代わりに試してください:

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