I test unitari dovrebbero testare la funzionalità e cercare di essere agnostici ai dettagli di implementazione. Mock.assert_called_with()
è una funzione comoda, tuttavia AFAIK confronta *args
a *args
e **kwargs
a **kwargs
. Pertanto:rendere Mock.assert_called_with() agnostico a args vs kwargs
# class to be mocked during test
class SomeClass():
def func(self,a,b,c=5):
# ...
# code under test
somaclass_instance.func(1,b=2,c=3)
# test code that works
someclass_mock.func.assert_called_with(1,b=2,c=3)
# test code that won't work
someclass_mock.func.assert_called_with(1,2,c=3)
someclass_mock.func.assert_called_with(a=1,b=2,c=3)
c'è un modo per generalizzare questo modo che le specifiche di cui *args
dove utilizzati come **kwargs
nella chiamata a func
, che in realtà è un dettaglio di implementazione, verranno ignorati?
Io non sono sicuro al 100% di aver capito la tua domanda, ma potresti passare * args e ** kwargs nella stessa chiamata di funzione, oppure, poiché gli argomenti sono di tipo tupla, e kwargs sono dicts, potresti essere in grado di scrivere una funzione wrapper che normalizza l'input a uno che sei sicuro di poter funzionare. –
C'è qualche finta struttura ormai che fa questo? I miei test non dovrebbero fallire solo perché qualcuno ha deciso di cambiare un argomento posizionale in un argomento di parole chiave ad un certo punto. Tuttavia, questa domanda è l'unica volta in cui ho mai visto questo problema menzionato. Mock supporta già spec-objects, quindi dovrebbe essere possibile? – jan