2013-11-28 20 views
7

Ho un metodo, che chiama un altro metodo due volte, con argomenti diversi.Test unitario: come affermare più chiamate dello stesso metodo?

class A(object): 
    def helper(self, arg_one, arg_two): 
     """Return something which depends on arguments.""" 

    def caller(self): 
     value_1 = self.helper(foo, bar) # First call. 
     value_2 = self.helper(foo_bar, bar_foo) # Second call! 

Utilizzando assert_called_with mi aiuta affermando solo la prima chiamata, e non il secondo. Anche assert_called_once_with non sembra essere utile. Cosa mi manca qui? C'è un modo per testare tali chiamate?

risposta

8

È possibile utilizzare mock_calls che contiene tutte le chiamate effettuate su un metodo. Questo elenco contiene anche la prima chiamata, la seconda chiamata e tutte le chiamate successive. Quindi puoi scrivere asserzioni con mock_calls[1] per indicare qualcosa sulla seconda chiamata.


Per esempio, se m = mock.Mock() e il codice non m.method(123) allora si scrive:

assert m.method.mock_calls == [mock.call(123)] 

che afferma che l'elenco delle chiamate verso m.method è esattamente una chiamata, vale a dire una chiamata con l'argomento 123.

+0

L'esempio nella loro documentazione non fa molto senso. Potresti mostrare un esempio migliore? – byxor

+1

@BrandonIbbotson Ho aggiunto un esempio alla mia risposta sopra. –

1

Per aggiungere alla risposta di Simon Visser, è possibile utilizzare il metodo unittest.TestCaseself.assertEqual() anziché la sintassi assert, che direi che è una pratica migliore nel contesto Test unità. Puoi anche aggiungere commenti ad esso che verranno visualizzati ogni volta che qualcosa va storto.

Così, per esempio:

self.assertEqual(
    [ 
     mock.call(1, 'ValueA', True)), 
     mock.call(2, 'ValueB', False)), 
     mock.call(3, 'ValueC', False)) 
    ], 
    mock_cur.execute.mock_calls, 
    "The method was not called with the correct arguments." 
) 
+0

Sarebbe bello se invece aggiorni la sua risposta, questa non sembra rispondere alla domanda. – 0xc0de