Si sta tentando di sostituire una funzione nidificata con un oggetto fittizio? Se è così, è abbastanza semplice, non importa quanto sia complicata la funzione. Puoi usare un MagicMock per sostituire praticamente qualsiasi oggetto python.
Se è necessario simulare una funzione che restituisce qualcosa, è sufficiente impostare il parametro MagicMock
. Sarebbe simile a questa:
>>> super_nested_mock = mock.MagicMock()
>>> super_nested_mock.return_value = 42
>>> super_nested_mock()
42
Tuttavia, se si sta cercando di testare un altro pezzo di codice che chiama la funzione super_nested
da qualche parte dentro, e si vuole prendere in giro fuori, è necessario utilizzare un patch . Nella biblioteca finto, sarà simile a questa:
with patch('super_nested') as super_nested_mock:
super_nested_mock.return_value = "A good value to test with"
assert my_function_that_calls_super_nested(5) == 20
Qui, nulla nel blocco with
che normalmente chiamare super_nested
invece chiamerà il super_nested_mock
e solo restituire il valore impostato ad esso.
C'è un po 'di sottigliezza in quello che è esattamente necessario inserire nella chiamata patch. Principalmente, vuoi applicare una patch all'oggetto mentre il modulo che stai testando lo vedrebbe. Vedi "where to patch" per ulteriori istruzioni.
Questo non funziona perché la funzione nidificata esiste solo nella funzione che voglio testare. Quindi 'patch' non può localizzarlo e sostituirlo direttamente. – satoru
Vedo, immagino di aver frainteso cosa stavi cercando di testare esattamente. Lascerò questo qui per i posteri. Buona fortuna però. – Wilduck