Qual è la sintassi prevista per il controllo dei messaggi di eccezione in assert_raises / must_raise del MiniTest?


Risposte:


150

Puoi usare l' assert_raisesaffermazione o l' must_raiseaspettativa.

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

Se devi testare qualcosa sull'oggetto errore, puoi ottenerlo dall'asserzione o aspettativa in questo modo:

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

Bene, ho capito. Tuttavia, sono ancora perso su come fare un'asserzione sul messaggio di errore generato.
kfitzpatrick

3
err = -> {bar.do_it} .must_raise RuntimeError sintassi non ha funzionato per me, ha continuato a sollevare la seguente eccezione. NoMethodError: metodo non definito ʻassert_raises 'per nil: NilClass
thanikkal

2
@thanikkal Assicurati di utilizzare Minitest::Spece non Minitest::Test. Le specifiche DSL, comprese le aspettative, sono disponibili solo durante l'utilizzo Minitest::Spec.
Blowmage

28

Per affermare l'eccezione:

assert_raises FooError do
  bar.do_it
end

Per affermare il messaggio di eccezione:

Come da documento API , assert_raisesrestituisce l'eccezione abbinata in modo da poter controllare il messaggio, gli attributi, ecc.

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

7

Minitest non fornisce (ancora) un modo per controllare l'effettivo messaggio di eccezione. Ma potresti aggiungere un metodo di supporto che lo faccia ed estendere la ActiveSupport::TestCaseclasse da usare ovunque nella tua suite di test rails, ad esempio: intest_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

e usalo nei tuoi test come:

assert_raises_with_message RuntimeError, 'Foo' do
  code_that_raises_RuntimeError_with_Foo_message
end

2
È vero che Minitest non supporta il controllo del messaggio di errore, tuttavia può essere ottenuto utilizzando must_raiseperché ti fornisce l'istanza dell'errore in modo da poter controllare il messaggio da solo.
bithavoc

1
Questa soluzione mi sembra migliore, ma non l'ho mai usata must_raiseprima.
pumazi

Penso che questa soluzione non fallirà se non viene sollevata alcuna eccezione. Devi solo controllare l'eccezione sollevata per essere quella corretta. Ma se non viene sollevata alcuna eccezione, non viene eseguita alcuna asserzione => nessun errore.
Foton

buon punto @Foton Ho cambiato la risposta per riflettere questa aspettativa.
Sviluppatore

0

Per aggiungere alcuni sviluppi più recenti, ci sono state alcune discussioni sull'aggiunta assert_raises_with_messagea minitest in passato senza molta fortuna.

Attualmente, c'è una promettente richiesta pull in attesa di essere unita. Se e quando verrà unito, potremo utilizzarlo assert_raises_with_messagesenza doverlo definire noi stessi.

Nel frattempo, c'è questo piccolo gioiello a portata di mano chiamato minitest-bonus-assertions che definisce esattamente quel metodo, insieme a pochi altri, in modo che tu possa usarlo fuori dagli schemi. Consulta i documenti per ulteriori informazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.