Ho una classe che sto testando che ha come dipendenza un'altra classe (un'istanza di cui viene passato al metodo init di CUT). Voglio prendere in giro questa classe usando la libreria Python Mock.Oggetto Mock Python con metodo chiamato più volte
Quello che ho è qualcosa di simile:
mockobj = Mock(spec=MyDependencyClass)
mockobj.methodfromdepclass.return_value = "the value I want the mock to return"
assertTrue(mockobj.methodfromdepclass(42), "the value I want the mock to return")
cutobj = ClassUnderTest(mockobj)
che va bene, ma "methodfromdepclass" è un metodo con parametri, e come tale voglio creare un singolo oggetto fittizio in cui a seconda di quali argomenti sono passati al methodfromdepclass restituisce valori diversi.
La ragione per cui desidero questo comportamento parametrizzato è che voglio creare più istanze di ClassUnderTest che contengono valori diversi (i cui valori sono prodotti da ciò che viene restituito da mockobj).
Kinda Quello che sto pensando (questo naturalmente non funziona):
mockobj = Mock(spec=MyDependencyClass)
mockobj.methodfromdepclass.ifcalledwith(42).return_value = "you called me with arg 42"
mockobj.methodfromdepclass.ifcalledwith(99).return_value = "you called me with arg 99"
assertTrue(mockobj.methodfromdepclass(42), "you called me with arg 42")
assertTrue(mockobj.methodfromdepclass(99), "you called me with arg 99")
cutinst1 = ClassUnderTest(mockobj, 42)
cutinst2 = ClassUnderTest(mockobj, 99)
# now cutinst1 & cutinst2 contain different values
Come faccio a ottenere questo tipo "ifcalledwith" semantica?
Impressionante, esattamente quello di cui avevo bisogno. Non è un fan della sintassi, ma funziona benissimo. Grazie! –
Un avvertimento che vorrei aggiungere qui in cui ho eseguito l'utilizzo di questa soluzione, che funziona molto bene, btw, è che se si intende avere eccezioni come effetti collaterali è necessario aumentarli, piuttosto che restituirli. La libreria Mock è utile per consentire di assegnare un'eccezione a side_effect e capirlo, ma con questo metodo devi fare il fai-da-te. – ThatsAMorais