2012-04-09 15 views
5

Sto provando a fare qualche test unitario usando la libreria di simulazione in Python. Ho il seguente codice:Assert call to method using Mock python

def a(): 
    print 'a' 

def b(): 
    print 'b' 
    if some condition 
     a() 

Come affermo che un invito a presentare b è stato fatto quando è stata fatta una chiamata finta di b? Ho provato il seguente codice, ma non è riuscito:

mymock=Mock() 
mymock.b() 
assertTrue(a.__call__ in mymock.mock_calls) 

Per qualche ragione, penso che il mymock.b() non ha nulla a che fare con il metodo b(). Cosa si può fare per questo?

risposta

7

Se si applica una patch a, è possibile garantire che è stato chiamato in questo modo:

with mock.patch('__main__.a') as fake_a: 
    b() 
    fake_a.assert_called_with() 

Se il metodo è in un modulo diverso:

import mymodule 

with mock.patch('mymodule.a') as fake_a: 
    mymodule.b() 
    fake_a.assert_called_with() 
+0

mi viene l'errore AttributeError: __exit__ –

+0

Stai usando il modulo di simulazione o creando un Mock()? Per questo è necessario semplicemente 'import mock' – Sionide21

+0

fare un oggetto Mock –

3

Somehow, I think that the mymock.b() has nothing to do with the method b() What can be done for this?

Hai ragione. Quando prendi in giro un oggetto, stai insinuando che non ti importa di quello che fa il tuo finto dietro le quinte. Se si desidera assicurarsi che a sia stato chiamato da b, si desidera patcha in b.

>>> from mock import patch 
>>> with patch('__main__.a') as patch_a: 
...  b() 
...  patch_a.assert_called_with() 

Così, la morale della storia è, finto o cerotto sopra l'oggetto che si desidera misurare senza realmente chiamare, non l'oggetto la cui attuazione che ti interessano. In questo caso ti interessa b e vuoi scoprire come usa a. Dal momento che non ci interessa cosa fa a, solo che viene chiamato, possiamo correggerlo.

Inoltre, se si desiderano ulteriori dettagli sulle chiamate a a, anziché assert_called_with è possibile analizzare tutte le chiamate effettuate accedendo all'attributo patch mock_calls. In questo caso sarebbe patch_a.mock_calls.

+0

ho provato la patch. Ho ancora un errore di attributo –

+0

Ho usato questo codice con quello che hai postato sopra (l'unica differenza è che ho sostituito 'alcune condizioni' con' Vero: '). Funzionava senza errori. Se ricevi un errore, per favore ** modifica la tua domanda ** e pubblica il codice che ti dà problemi e traccia dello stack. Senza queste informazioni non posso fare nulla per aiutarti a risolvere i problemi. – Wilduck