2014-11-10 22 views
6

Sono nuovo di minitest e ancora nuovo di ruby ​​e davvero stanco di provare a google questa domanda senza risultato. Sarei davvero grato per l'aiuto:Ruby minitest assert_output syntax

Qual è la sintassi esatta di assert_output in ruby ​​minitest?

Tutto ciò che trovo su github o altrove sembra utilizzare le parentesi. Tuttavia, ricevo un messaggio di errore quando non uso un blocco con assert_output, il che ha senso in quanto la definizione di questo metodo contiene una dichiarazione di rendimento.

Ma non riesco a farlo funzionare, qualunque cosa provi.

testclass.rb

class TestClass 
    def output 
    puts 'hey' 
    end 
end 

test_test.rb

require 'minitest/spec' 
require 'minitest/autorun' 
require_relative 'testclass' 


class TestTestClass < MiniTest::Unit::TestCase 
    def setup 
    @test = TestClass.new 
    end 

    def output_produces_output 
    assert_output(stdout = 'hey') { @test.output} 
    end 
end 

Quello che ottengo è:

test finiti in 0.000000s, NaN Test/s, le affermazioni NaN

0 test, 0 asserzioni, 0 errori, 0 errori, 0 salti

Cosa sto sbagliando? Deve essere qualcosa di totalmente ovvio, ma non riesco a capirlo. Grazie per il vostro aiuto.

risposta

10

Per eseguire il metodo di prova, il nome del metodo deve iniziare con test_. Inoltre, il modo in cui funziona assert_output è che il blocco scriverà su stdout/stderr e gli argomenti verranno controllati se corrispondono a stdout/stderr. Il modo più semplice per verificare questo IMO è di passare a un'espressione regolare. Quindi questo è come scriverei quel test:

class TestTestClass < MiniTest::Unit::TestCase 
    def setup 
    @test = TestClass.new 
    end 

    def test_output_produces_output 
    assert_output(/hey/) { @test.output} 
    end 
end 
+0

GRAZIE !! Quindi il nome del metodo non iniziava con 'test' e stavo interrogando la sintassi. Grazie per avermi risparmiato di cercare più a lungo sulla domanda sbagliata. – enahel

+0

Un'altra domanda: l'esempio funziona nel modo in cui lo hai scritto con regex, funziona anche nel modo in cui l'ho scritto con stdout = 'hey'. Non funziona con solo assert_output ('hey') senza 'stdout ='. Perché? – enahel

+1

E - infine - perché posso avere più asserzioni che corse in minitest? Nel mio esempio attuale c'è un solo test, dice "1 corre, 2 asserzioni". (BTW Posso sopprimere l'output stdout effettivo del metodo durante il test per avere il prompt dei comandi più leggibile?) – enahel