रेल / आरएसपीईसी में अपवाद का परीक्षण कैसे करें?


84

निम्नलिखित कोड है:

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 0 मौजूद नहीं है, इसलिए मेरा नियंत्रक कोड त्रुटियां पैदा करता है :: CarBrandNotFound, लेकिन मेरा परीक्षण कोड मुझे बताता है कि कुछ भी नहीं उठाया गया था। मेरे द्वारा यह कैसे किया जा सकता है? मैं क्या गलत करूँ?

जवाबों:


115

त्रुटि से निपटने की कल्पना करने के लिए, आपकी उम्मीदों को एक ब्लॉक पर सेट करने की आवश्यकता है; किसी वस्तु का मूल्यांकन एक त्रुटि नहीं बढ़ा सकता है।

तो आप ऐसा कुछ करना चाहते हैं:

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

देखें त्रुटि की अपेक्षा जानकारी के लिए।

मैं थोड़ा आश्चर्यचकित हूं कि आपको अपने अपवाद परिणामों तक कोई अपवाद नहीं मिला है, हालांकि।


1
@ jakob-s अपेक्षित त्रुटि व्यवहार जो आप यहां उपयोग कर रहे हैं, वह नियंत्रक अनुरोधों पर काम नहीं करता है। get :index, car_brand_id: 0खुद एक त्रुटि उठाना नहीं है।
रिकार्डो ओटेरो

@RicardoOtero चीजें बदल सकती हैं, लेकिन जो इसके लायक है, वह मेरे लिए है: gist.github.com/koppen/0e1d0894a908a3768847 । लेकिन निश्चित रूप से, स्टैक में कुछ त्रुटि को संभाल सकता है इससे पहले कि वह विशेष धावक तक पहुंच जाए।
जैकब एस

यह वर्तमान rspec संस्करणों के लिए सही जवाब है, जिसे वोट दिया जाना चाहिए
नील वुड्स

वह सही है। अपवादों का परीक्षण करने का सही तरीका विधि के अलावा () के बजाय {} का उपयोग कर रहा है।
लुइज हेनरिक

109

के expect{}बजाय का उपयोग करें expect()


7
यह इंगित करने योग्य है कि यह समस्या को हल करता है क्योंकि {} सिंटैक्स एक अपवाद बनाता है जिसे दिए जाने वाले अपवाद को मॉनिटर करने के लिए उठाया जा सकता है। मिनीटेस्ट की समान सिंटैक्स आवश्यकताएं हैं जब यह जांचना कि कोड का एक ब्लॉक एक अपवाद उठाता है।
अर्गुस

1
इतना छोटा खतरा बदल जाता है। क्या मैं थोड़ी देर के लिए अपने पहियों को पीस रहा था। इसके लिए धन्यवाद।
जोश

4
मैं इस पर विश्वास नहीं कर सकता। 1 घंटे की कोशिश और यह बस में बदल ( )रहा है { }! बहुत बहुत धन्यवाद
साइमन फ्रेंज़ेन

1
हाँ, मेरे लिए वही - मेरा मानना ​​है कि मैंने अधिक खर्च किया है :) क्योंकि मैंने इसका समाधान यहां पोस्ट किया है
kaleb4eg

2
मुझे पता है कि मुझे पूछने के लिए टिप्पणियों का उपयोग करना चाहिए ... लेकिन फिर भी, मैं आपको प्रतिक्रिया के लिए धन्यवाद देना चाहूंगा। कई दृष्टिकोणों के बाद आखिरकार मुझे अपनी समस्या का हल मिल गया।
फ्लोरिन लेई

18

get :index एक अपवाद कभी नहीं बढ़ाएगा - यह एक वास्तविक सर्वर के रूप में किसी तरह 500 त्रुटि होने के लिए प्रतिक्रिया निर्धारित करेगा।

इसके बजाय कोशिश करें:

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

1
मुझे खुशी है कि किसी ने इसका उल्लेख किया! :) जैकब ने उन्हें शिक्षित करने की कोशिश की कि यह सबसे उत्कीर्ण उत्तर में कभी भी अपवाद नहीं उठाएगा लेकिन उसका सामना कुछ गलत प्रतिरोध के साथ हुआ। 👍
तारेक एन Elsamni
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.