Voglio affermare che un classmethod in una classe Python chiama un altro classmethod con un certo insieme di argomenti. Mi piacerebbe che il classmethod deriso fosse "spec -ato", quindi rileva se viene chiamato con il numero sbagliato di argomenti.Come applicare patch classmethod con autospec in una classe non bloccata?
Quando cerco il metodo di classe utilizzando patch.object(.., autospec=True, ..)
, il metodo di classe viene sostituito con un NonCallableMagicMock
e genera un errore quando provo a chiamarlo.
from mock import patch
class A(object):
@classmethod
def api_meth(cls):
return cls._internal_classmethod(1, 2, 3)
@classmethod
def _internal_classmethod(cls, n, m, o):
return sum(n, m, o)
with patch.object(A, '_internal_classmethod') as p:
print(type(p).__name__)
with patch.object(A, '_internal_classmethod', autospec=True) as p:
print(type(p).__name__)
produce l'uscita:
MagicMock
NonCallableMagicMock
Come posso ottenere un mock spec-ed per _internal_classmethod
quando la classe a cui appartiene non è preso in giro?
Questo risolve il problema di recuperare un NonCallableMagicMock, ma sfortunatamente non fornisce il comportamento di cattura della mancata corrispondenza della firma di chiamata sul classmethod deriso. Questo comportamento è importante perché protegge da test falsi che passano anche se il codice stesso è rotto, forse cambiando la firma della chiamata del metodo. Sospetto che il comportamento che sto cercando sia un "parziale autospec" e che forse il mock non supporta ancora quel genere di cose. – scanny