2009-05-07 11 views
5

मेरे पास रूबी ऐप पर रूबी ऐप्स में कई नियंत्रक हैं जो कार्रवाई के अंत में एक बचाव हैंडलर के साथ हैं जो मूल रूप से किसी भी अनचाहे त्रुटियों को पकड़ता है और किसी प्रकार की "उपयोगकर्ता अनुकूल" त्रुटि देता है। हालांकि, जब मैं रेक परीक्षण कर रहा हूं, तो मैं उन डिफ़ॉल्ट बचाव हैंडलर को अक्षम करना चाहता हूं ताकि मैं पूर्ण त्रुटि & स्टैक ट्रेस देख सकूं। क्या ऐसा करने का कोई स्वचालित तरीका है?जब मैं कार्यात्मक परीक्षण चला रहा हूं तो मैं रेल ऐप पर रूबी में बचाव हैंडलर को कैसे अक्षम करूं?

अद्यतन स्पष्ट करने के लिए: मैं इस तरह एक कार्रवाई है: अब

def foo 
    # do some stuff... 
rescue 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 

जब मैं कार्यात्मक परीक्षण इस, अगर अपवाद तब उठाया है मैं के बारे में जानकारी का सिर्फ एक छोटा सा पाने के लिए जा रहा हूँ अपवाद, लेकिन मुझे यह पसंद करना है कि वहां कोई बचाव करने वाला यंत्र नहीं है, इसलिए मुझे पूर्ण डीबग जानकारी मिलती है।

अद्यतन: समाधान

मैंने किया था यह:

rescue: 
    raise unless Rails.env.production? 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
    end 

उत्तर

9

काफी स्वचालित नहीं है, लेकिन परीक्षण के दौरान बुलाए जाने पर अपवादों को फिर से फेंकने के लिए आपके कोड को कैसे संशोधित किया जा सकता है?

शायद कुछ इस तरह:

def foo 
    # do some stuff... 
rescue 
    raise if ENV["RAILS_ENV"] == "test" 
    render :text => "Exception: #{$!}" # this could be any kind of custom render 
end 
+0

अच्छा मैं कोशिश करूँगा! –

+3

उठाएं यदि Rails.env.test? क्लीनर आईएमओ – Scott

+0

@ स्टेवन है यह वास्तव में केवल उत्पादन में ही बचाव नहीं करता है। यह कहां उठाता है .. लेकिन यदि आपके पास #do सामान में कोड की 20 लाइनें हैं तो raise इस पर कोई संदर्भ नहीं देता है। ट्रेस उस पंक्ति पर हुई त्रुटि को इंगित करता है जो raise चालू है। – baash05

0

आप assert_raise(exception1, exception2, ...) { block } कॉल का उपयोग करके और फिर ब्लॉक से अपवाद मुद्रण को देखा है?

0

आप किस विधि का उपयोग कर रहे हैं? ActionController में दो बचाव विधियां हैं।

मैं अपने आधार नियंत्रक में इस है:

def rescue_action_in_public(exception) 
    response_code = response_code_for_rescue(exception) 
    status = interpret_status(response_code) 
    respond_to do |format| 
     format.html { render_optional_error_file response_code} 
     format.js { render :update, :status => status do |page| page.redirect_to(:url => error_page_url(status)) end} 
end 

अंत उत्पादन मोड में

यह केवल प्रदर्शित करता है कस्टम त्रुटियों।

+0

क्यों यह केवल उत्पादन मोड में चलता है? मुझे वह नहीं दिख रहा है। –

-1

आपको अपने बचाव ब्लॉक को अक्षम करने की आवश्यकता नहीं है। Assert_raise विधि का उपयोग करें (स्कॉट द्वारा सुझाए गए अनुसार), और ब्लॉक में, उस विधि को कॉल करें जिसे आप अपवाद की अपेक्षा करते हैं।

उदाहरण के लिए:

def test_throws_exception 
    assert_raise Exception do 
    raise_if_true(true) 
    end 
end 
+0

मैं अपवाद का दावा करने की कोशिश नहीं कर रहा हूं, मुझे यह पता है कि यह कैसे करें और इसे कई बार किया है। मैं उन अपवादों के बारे में पूरी जानकारी प्राप्त करने का प्रयास कर रहा हूं जो तब होती हैं जब मैं उनसे अपेक्षा नहीं करता (स्टैक ट्रेस सहित) लेकिन केवल तभी जब मैं परीक्षण मोड में हूं। –

+0

आह। माफ़ कीजिये। मैं समझ गया कि आप क्या हासिल करने की कोशिश कर रहे थे। –

0

मुझे लगता है कि ऐसा करने के लिए सबसे आसान काम सत्यापित करें कि सही प्रस्तुत करना called-- था या जो कुछ भी नियमित रूप से, गैर असाधारण मामलों से अलग किया गया है।

संबंधित मुद्दे