Ho costruito un sistema di fatturazione CMS + paywalled per un client e ho bisogno di essere più severo con i miei test.Simulazione del passare del tempo in unittest
Conservo tutti i miei dati in un ORG Django e ho un sacco di attività di Celery che funzionano a intervalli diversi che assicurano che nuove fatture e promemoria di fatture vengano inviate e tagli di accesso quando gli utenti non pagano le loro fatture.
Per esempio mi piacerebbe essere un grado di eseguire un test che:
crea un nuovo utente e genera una fattura per X giorni di accesso al sito
simula il passaggio di X + 1 giorni e esegue tutti i compiti che ho impostato su Celery.
Verifica che una nuova fattura per altri X giorni sia stata rilasciata all'utente.
L'approccio BACIO mi è venuta in mente finora è quello di fare tutti i test su una macchina separata ed effettivamente manipolare la data/ora a livello di sistema operativo. Quindi lo script di test sarebbe:
Impostare la data di sistema al giorno 1
Creare un nuovo utente e generare la prima fattura per X giorni di accesso
Advance poi data di sistema 1 giorno . Gestisci tutti i miei compiti di sedano. Ripetere fino a X + 1 giorni sono "passati"
Controllare che una nuova fattura è stata emessa
E 'un po' goffo, ma penso che potrebbe funzionare. Qualche altra idea su come ottenerlo?
Viene visualizzato un errore durante il tentativo: TypeError: impossibile impostare gli attributi di tipo built-in/extension "datetime.datetime".Traccia: Traceback (ultima chiamata ultima): // File "", riga 1, in // File "/usr/lib/python2.7/dist-packages/mock.py", riga 623, in __enter__ // setattr (self.target, self.attribute, new_attr) –
Alfe
Scusami, l'ho dimenticato. Ho avuto questo problema di recente, e ho una soluzione alternativa. Dammi solo qualche minuto e aggiornerò la risposta. – madjar
Hmm, non è stata eseguita anche la versione, mi dispiace. Dopo aver chiamato 'setUp()' i risultati di 'datetime.datetime.now()' non sono influenzati dall'impostazione di 'self.time'. Forse mi sto sbagliando ancora. – Alfe