Làm thế nào để kiểm tra việc tăng ngoại lệ trong Rails / RSpec?


84

Có mã sau:

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

Tôi muốn kiểm tra nó thông qua RSpec. Mã của tôi là:

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

CarBrand với id bằng 0 không tồn tại, do đó mã bộ điều khiển của tôi tăng Lỗi :: CarBrandNotFound, nhưng mã kiểm tra của tôi cho tôi biết rằng không có gì được đưa ra. Làm thế nào tôi có thể sửa chữa nó? Tôi làm gì sai?

Câu trả lời:


115

Để chỉ định xử lý lỗi, kỳ vọng của bạn cần được đặt trên một khối; đánh giá một đối tượng không thể nêu ra lỗi.

Vì vậy, bạn muốn làm một cái gì đó như sau:

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

Xem Lỗi mong đợi để biết chi tiết.

Tuy nhiên, tôi hơi ngạc nhiên khi bạn không nhận được bất kỳ ngoại lệ nào cho kết quả thông số kỹ thuật của mình.


1
@ jakob-s, hành vi lỗi mong đợi mà bạn đang sử dụng ở đây không hoạt động trên các yêu cầu của bộ điều khiển. Bản get :index, car_brand_id: 0thân nó không gây ra lỗi.
Ricardo Otero

@RicardoOtero Mọi thứ có thể đã thay đổi, nhưng đối với những gì nó đáng giá, nó phù hợp với tôi: gist.github.com/koppen/0e1d0894a908a3768847 . Nhưng chắc chắn, một cái gì đó trong ngăn xếp có thể đang xử lý lỗi trước khi nó bong bóng đến trình chạy thông số kỹ thuật.
Jakob S

Đây là câu trả lời đúng cho các phiên bản ans rspec hiện tại nên được bình chọn lên
Neil Woods

Đúng rồi. Biểu mẫu chính xác để kiểm tra các ngoại lệ đang sử dụng {} thay vì () trên phương thức ngoại trừ.
Luiz Henrique

109

Sử dụng expect{}thay vì expect().


7
Cần chỉ ra rằng điều này giải quyết được vấn đề vì cú pháp {} tạo ra một khối để theo dõi ngoại lệ nhất định được nêu ra. MiniTest có các yêu cầu cú pháp tương tự khi kiểm tra rằng một khối mã tạo ra một ngoại lệ.
Argus9

1
Như một thay đổi dang nhỏ. Tôi đã mài bánh xe một lúc. Cám ơn vì cái này.
josh

4
Tôi không thể tin được. 1 giờ cố gắng và nó chỉ biến ( )thành { }! Cảm ơn bạn rất nhiều
Simon Franzen

1
Yeah, cùng đối với tôi - Tôi tin rằng tôi đã dành hơn :) vì lý do đó tôi đã gửi giải pháp ở đây
kaleb4eg

2
Tôi biết rằng tôi nên sử dụng bình luận để hỏi ... nhưng tôi vẫn muốn cảm ơn bạn đã phản hồi. Sau nhiều cách tiếp cận cuối cùng tôi đã tìm ra giải pháp cho vấn đề của mình.
Florin Lei

18

get :index sẽ không bao giờ nêu ra ngoại lệ - nó sẽ đặt phản hồi là lỗi 500 theo cách nào đó như một máy chủ thực sẽ làm.

Thay vào đó hãy thử:

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

1
Tôi rất vui vì ai đó đã đề cập đến điều này! :) Jakob đã cố gắng giáo dục họ rằng nó sẽ không bao giờ nêu ra một ngoại lệ trong câu trả lời được ủng hộ nhiều nhất nhưng anh ta đã phải đối mặt với một số phản kháng không chính xác. 👍
Tarek N. Elsamni
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.