MiniTest'in assert_raises / must_raise'daki istisna mesajlarını kontrol etmek için beklenen sözdizimi nedir?


Yanıtlar:


151

Sen kullanabilirsiniz assert_raisesiddiayı veya must_raisebeklenti.

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

Hata nesnesi üzerinde bir şeyi test etmeniz gerekiyorsa, bunu aşağıdaki gibi iddia veya beklentiden elde edebilirsiniz:

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

Harika, anladım. Ancak, ortaya çıkan hatanın mesajıyla ilgili bir iddiada bulunma konusunda hala kayboldum.
kfitzpatrick

3
err = -> {bar.do_it} .must_raise RuntimeError sözdizimi benim için çalışmadı, aşağıdaki istisnayı yükseltmeye devam etti. NoMethodError: nil için tanımsız yöntem `` assert_raises '': NilClass
thanikkal

2
@thanikkal Kullanmakta olduğunuzdan Minitest::Specve kullanmadığınızdan emin olunuz Minitest::Test. Spesifik DSL, beklentiler dahil, yalnızca kullanılırken mevcuttur Minitest::Spec.
2016

28

İstisna iddia etmek için:

assert_raises FooError do
  bar.do_it
end

İstisna mesajı ileri sürmek için:

Gereğince API doc , assert_raisesvb, mesajı kontrol edebilirsiniz böylece istisna eşleşti döndürür nitelikleri

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

8

Minitest (henüz) size gerçek istisna mesajını kontrol etmenin bir yolunu sağlamaz. Ancak, bunu yapan ve ActiveSupport::TestCasesınıfı, rails test paketinizin her yerinde kullanmak için genişleten bir yardımcı yöntem ekleyebilirsiniz , örneğin: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

ve aşağıdaki gibi testlerinizde kullanın:

assert_raises_with_message RuntimeError, 'Foo' do
  code_that_raises_RuntimeError_with_Foo_message
end

2
Minitest'in hata mesajını kontrol etmeyi desteklemediği doğrudur, ancak bunu kullanarak başarılabilir, must_raiseçünkü size hatanın örneğini verir, böylece mesajı kendiniz kontrol edebilirsiniz.
bithavoc

1
Bu çözüm bana daha iyi geliyor ama daha must_raiseönce kullanmadım.
pumazi

Herhangi bir İstisna ortaya çıkmazsa bu çözümün başarısız olmayacağını düşünüyorum. Sadece yükseltilmiş istisnanın doğru olduğunu kontrol edin. Ancak hiçbir istisna ortaya çıkmazsa, hiçbir iddia yapılmaz => hata yok.
Foton

iyi nokta @Foton Bu beklentiyi yansıtmak için cevabı değiştirdim.
Geliştirici

0

Daha yeni gelişmeleri eklemek için, geçmişte çok şanssız bir şekilde minitest'e ekleme konusunda bazı tartışmalar oldu assert_raises_with_message.

Şu anda, birleştirilmeyi bekleyen gelecek vaat eden bir çekme talebi var . Birleştirilirse ve ne zaman birleşirse, assert_raises_with_messageonu kendimiz tanımlamak zorunda kalmadan kullanabileceğiz .

Bu arada, tam olarak bu yöntemi tanımlayan minitest-bonus-assertions adında bu kullanışlı küçük cevher var, birkaç başka yöntemle birlikte, böylece onu kutudan çıkarırsınız . Daha fazla bilgi için belgelere bakın .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.