MiniTest के assert_raises / must_raise में अपवाद संदेशों की जाँच के लिए अपेक्षित सिंटैक्स क्या है?


86

मिनीटेस्ट assert_raises/ में अपवाद संदेशों की जाँच के लिए अपेक्षित सिंटैक्स क्या है must_raise?

मैं निम्नलिखित जैसा कुछ करने की कोशिश कर रहा हूँ, जहाँ "Foo"अपेक्षित त्रुटि संदेश है:

proc { bar.do_it }.must_raise RuntimeError.new("Foo")

जवाबों:


150

आप assert_raisesदावे या must_raiseअपेक्षा का उपयोग कर सकते हैं ।

it "must raise" do
  assert_raises RuntimeError do 
    bar.do_it
  end
  ->     { bar.do_it }.must_raise RuntimeError
  lambda { bar.do_it }.must_raise RuntimeError
  proc   { bar.do_it }.must_raise RuntimeError
end

यदि आपको त्रुटि ऑब्जेक्ट पर कुछ परीक्षण करने की आवश्यकता है, तो आप इसे दावे या अपेक्षा से प्राप्त कर सकते हैं:

describe "testing the error object" do
  it "as an assertion" do
    err = assert_raises RuntimeError { bar.do_it }
    assert_match /Foo/, err.message
  end

  it "as an exception" do
    err = ->{ bar.do_it }.must_raise RuntimeError
    err.message.must_match /Foo/
  end
end

कूल, मुझे वह मिल गया। हालाँकि, मैं अभी भी खो गया हूं कि उठाए गए त्रुटि संदेश पर कैसे जोर दिया जाए।
kfitzpatrick

3
तक = -> {bar.do_it} .must_raise RuntimeError सिंटैक्स मेरे लिए काम नहीं करता था, यह निम्नलिखित अपवाद को बढ़ाता रहा। NoMethodError: अपरिभाषित विधि _assert_raises 'for nil: NilClass
thanikkal

2
@thanikkal सुनिश्चित करें कि आप उपयोग कर रहे हैं Minitest::Specऔर नहीं Minitest::Test। स्पेक डीएसएल, उम्मीदों सहित, केवल उपयोग करते समय उपलब्ध हैं Minitest::Spec
झटका

28

अपवाद का दावा करने के लिए:

assert_raises FooError do
  bar.do_it
end

अपवाद संदेश मुखर करने के लिए:

एपीआई डॉक्टर के अनुसार , assert_raisesमिलान किया गया अपवाद लौटाता है ताकि आप संदेश, विशेषताओं आदि की जांच कर सकें।

exception = assert_raises FooError do
  bar.do_it
end
assert_equal('Foo', exception.message)

7

मिनिटेस्ट आपको वास्तविक अपवाद संदेश की जांच करने का एक तरीका (अभी तक) प्रदान नहीं करता है। लेकिन आप एक सहायक विधि जोड़ सकते हैं जो इसे करता है और ActiveSupport::TestCaseअपने रेल परीक्षण सूट में हर जगह उपयोग करने के लिए कक्षा का विस्तार करता है , जैसे: अंदरtest_helper.rb

class ActiveSupport::TestCase
  def assert_raises_with_message(exception, msg, &block)
    block.call
  rescue exception => e
    assert_match msg, e.message
  else
    raise "Expected to raise #{exception} w/ message #{msg}, none raised"
  end
end

और अपने परीक्षणों में इसका उपयोग करें जैसे:

assert_raises_with_message RuntimeError, 'Foo' do
  code_that_raises_RuntimeError_with_Foo_message
end

2
यह सच है कि Minitest त्रुटि संदेश की जाँच करने का समर्थन नहीं करता है, हालाँकि इसका उपयोग करके प्राप्त किया जा सकता है must_raiseक्योंकि यह आपको त्रुटि का उदाहरण देता है ताकि आप स्वयं संदेश की जाँच कर सकें।
बीथवॉक

1
यह समाधान मुझे बेहतर लगता है, लेकिन मैंने पहले इस्तेमाल नहीं किया है must_raise
पमजी

मुझे लगता है कि यदि कोई अपवाद उत्पन्न नहीं हुआ तो यह समाधान विफल नहीं होगा। आप सही होने के लिए उठाए गए अपवाद की जांच करें। लेकिन यदि कोई अपवाद नहीं उठाया जाता है, तो कोई दावा नहीं किया जाता है => कोई त्रुटि नहीं है।
फोटॉन

अच्छा बिंदु @ फ़ोटोन मैंने उस उम्मीद को प्रतिबिंबित करने के लिए उत्तर बदल दिया।
डेवलपर

0

कुछ और हालिया घटनाक्रमों को जोड़ने के लिए, अतीत में बहुत अधिक भाग्य के बिना मिनिटेस्ट को जोड़ने पर कुछ चर्चाएं हुई हैंassert_raises_with_message

वर्तमान में, एक आशाजनक पुल अनुरोध है जो विलय होने की प्रतीक्षा कर रहा है। यदि और जब यह विलय हो जाता है, तो हम assert_raises_with_messageइसे स्वयं परिभाषित करने के बिना उपयोग कर पाएंगे ।

इस बीच, मिनिटेस्ट-बोनस-एसेरिअन्स नाम का यह छोटा सा रत्न है जो कुछ अन्य लोगों के साथ-साथ उस पद्धति को ठीक से परिभाषित करता है, ताकि आप इसे बॉक्स से बाहर कर सकें। अधिक जानकारी के लिए डॉक्स देखें ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.