Ho un signal_handler collegato tramite un decoratore, qualcosa di simile molto semplice:Come faccio a prendere in giro un gestore di segnale django?
@receiver(post_save, sender=User,
dispatch_uid='myfile.signal_handler_post_save_user')
def signal_handler_post_save_user(sender, *args, **kwargs):
# do stuff
Quello che voglio fare è prendere in giro lo con la libreria finta http://www.voidspace.org.uk/python/mock/ in un test, per verificare quante volte Django lo chiama. Il mio codice in questo momento è qualcosa di simile:
def test_cache():
with mock.patch('myapp.myfile.signal_handler_post_save_user') as mocked_handler:
# do stuff that will call the post_save of User
self.assert_equal(mocked_handler.call_count, 1)
Il problema qui è che il gestore del segnale originale è chiamato anche se preso in giro, molto probabilmente perché il decoratore @receiver
memorizza una copia del gestore di segnale da qualche parte, così ho' Sto deridendo il codice sbagliato.
Quindi la domanda: come faccio a prendere in giro il mio gestore di segnale per far funzionare il mio test?
Si noti che se cambio gestore del segnale a:
def _support_function(*args, **kwargs):
# do stuff
@receiver(post_save, sender=User,
dispatch_uid='myfile.signal_handler_post_save_user')
def signal_handler_post_save_user(sender, *args, **kwargs):
_support_function(*args, **kwargs)
e mi prendo gioco _support_function
invece, tutto funziona come previsto.
non dovrebbe 'assert_equal' essere' assertEquals (...) '? –
Dipende dalla suite di test che si sta utilizzando; django di default usa 'unittest', che ha 'assertEquals' come dici tu; Io uso sempre il "naso" che, secondo me, è superiore in molti aspetti, e il naso ha un "assert_equal". Quando scrivo la mia risposta, copia/incolla dal mio codice di produzione, ecco perché vedi 'assert_equal' lì. Ho modificato la risposta per rispettare il default di Django, grazie per aver segnalato questo – StefanoP
grazie! Uso anche il naso ma non ho mai realizzato che esistesse assert_equal –