次のコードがあります。
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が発生しますが、テストコードでは何も発生していないことがわかります。どうすれば修正できますか?何が悪いの?
エラー処理を指定するには、ブロックに期待値を設定する必要があります。オブジェクトを評価してもエラーは発生しません。
だからあなたはこのようなことをしたい:
expect {
get :index, car_brand_id: 0
}.to raise_error(Errors::CarBrandNotFound)
詳細については、 Expect error を参照してください。
ただし、スペックの結果に例外が発生しないことに少し驚いています。
expect()
の代わりにexpect{}
を使用します。
get :index
は決して例外を送出しません-実際のサーバーが行うように、応答を何らかの方法で500エラーに設定します。
代わりに試してください:
it 'raises CarBrandNotFound exception' do
controller.params[:car_brand_id] = 0
expect{ controller.car_brand }.to raise_error(Errors::CarBrandNotFound)
end