2012-08-01 6 views
44

Ho cercato la documentazione, ma non ho trovato nessuna. C'erano una coppia che non spiegava molto.Come usare gli assert_raises del naso?

qualcuno può spiegare a me funzione

assert_raises(what should I put here?) 

del naso e come usarlo?

risposta

59

I test di funzione assert_raises() assicurano che una chiamata di funzione sollevi un'eccezione specificata quando viene presentata con determinati parametri.

Ad esempio, se si dispone di una funzione add che aggiunge due numeri, è probabile che venga generato un valore TypeError quando lo si passa, ad esempio, un numero intero e una stringa. Quindi:

from nose.tools import assert_raises 

def add(x, y): 
    return x + y 

assert_raises(TypeError, add, 2, "0") 

Il primo argomento è il tipo di eccezione che ci si aspetta. Il secondo è la funzione da chiamare. Il resto degli argomenti verrà passato alla funzione (in questo caso, diventeranno x e all'interno della funzione).

Se l'eccezione prevista viene aumentata dalla funzione, passa l'asserzione.

+1

Ok, grazie! Ma sai anche un link per una buona documentazione naso dove posso checkout altre funzioni del naso, come assert_equal, assert_raises! @kindall – user1544624

+0

ho avuto difficoltà a trovare anche quello. Puoi comunque provare 'help (assert_rases)'. – kindall

+4

Un po 'nascosto, ma http://nose.readthedocs.org/en/latest/testing_tools.html#module-nose.tools afferma gli stati del primo paragrafo: "... e tutti gli stessi metodi assertX trovati in unittest.TestCase (solo scritto in modo PEP 8, quindi assert_equal piuttosto che assertEqual). ". Ecco la lista: http://docs.python.org/2/library/unittest.html#assert-methods –

78

Mentre la risposta accettata è corretta, penso che sia meglio utilizzare il metodo assert_raises.

Se si desidera semplicemente affermare che si verifica un'eccezione, è probabilmente più semplice e più pulito utilizzare la sintassi @raises.

@raises(HTTPError) 
def test_exception_is_raised: 
    call_your_method(p1, p2) 

tuttavia, supporre che si vuole fare po 'di più con l'eccezione sollevata, ad esempio: abbiamo bisogno di affermare che sollevato HTTPError è di tipo 401: non autorizzato, invece di 500: Errore del server.

In una situazione di cui sopra la sintassi non è così utile, dovremmo usare lo assert_raises ma in un modo diverso. Se non lo passiamo a callable, il secondo parametro assert_raises restituirà un contesto che possiamo utilizzare per testare ulteriormente i dettagli dell'eccezione.

def test_exception_is_raised: 
    with assert_raises(HTTPError) as cm: 
     call_your_method(p1, p2) 
    ex = cm.exception # raised exception is available through exception property of context 
    ok_(ex.code == 401, 'HTTPError should be Unauthorized!') 
+8

Grazie mi ha insegnato qualcosa di nuovo. – user1544624

+0

Mi piacerebbe vedere il messaggio dell'eccezione. L'ex che ottengo da cm.exception ha un ex.message vuoto. L'eccezione è comunque sollevata con un messaggio. Cosa sta andando storto? – akshitBhatia

+1

L'unico posto in cui sono riuscito a trovare informazioni su come farlo ... –

Problemi correlati