developer tip

Rails / RSpec에서 예외 발생을 테스트하는 방법은 무엇입니까?

copycodes 2020. 10. 28. 08:12
반응형

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가 발생하지만 테스트 코드는 아무것도 발생하지 않았다고 알려줍니다. 어떻게 고칠 수 있습니까? 내가 뭘 잘못 했어?


오류 처리를 지정하려면 블록에 대한 기대치를 설정해야합니다. 객체를 평가해도 오류가 발생할 수 없습니다.

따라서 다음과 같이하고 싶습니다.

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

자세한 내용은 예상 오류 를 참조하세요.

그래도 사양 결과까지 예외가 발생하지 않는다는 사실에 약간 놀랐습니다.


사용 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

참고 URL : https://stackoverflow.com/questions/22141601/how-to-test-exception-raising-in-rails-rspec

반응형