Ich habe ein paywalled CMS + Fakturierungssystem für einen Kunden erstellt, und ich muss mit meinen Tests strenger werden.Simulieren des Zeitablaufs in Unitests
Ich behalte alle meine Daten in einem Django ORM und habe eine Reihe von Sellerie-Aufgaben, die in verschiedenen Intervallen laufen, um sicherzustellen, dass neue Rechnungen und Rechnungserinnerungen gesendet werden und Zugriffsbeschränkungen, wenn Benutzer ihre Rechnungen nicht bezahlen.
Zum Beispiel würde eine Ich mag die Lage sein, einen Test auszuführen, dass:
einen neuen Benutzer erstellt und erzeugt eine Rechnung für X Tage Zugriff auf die Website
die Simuliert Passing von X + 1 Tagen, und führt alle Aufgaben, die ich in Sellerie eingerichtet habe.
Prüft, dass für den Benutzer eine neue Rechnung für weitere X Tage ausgestellt wurde.
Der KISS Ansatz, den ich mit so weit habe kommen ist es, alle Tests auf einer separaten Maschine zu tun, und tatsächlich das Datum/Zeit an der OS-Ebene zu manipulieren. Also das Testskript würde:
das Systemdatum 1 bis Tag Set
einen neuen Benutzer erstellen und die erste Rechnung für X Tage des Zugangs erzeugt
Voraus dann Systemdatum 1 Tag . Führe alle meine Sellerieaufgaben aus. Wiederholen, bis X + 1 Tage Es wurden „bestanden“
Überprüfen Sie, ob eine neue Rechnung
ausgestellt Es ist ein bisschen klobig, aber ich denke, dass es funktionieren könnte. Irgendwelche anderen Ideen, wie man es schafft?
Ich bekomme eine Fehlermeldung, wenn Sie dies versuchen: TypeError: kann Attribute der integrierten/Erweiterungstyp 'datetime.datetime' nicht festlegen.Trace: Traceback (letzter Aufruf zuletzt): // Datei "", Zeile 1, in // Datei "/usr/lib/python2.7/dist-packages/mock.py", Zeile 623, in __enter__ // setattr (self.target, self.attribute, new_attr) –
Alfe
Entschuldigung, das habe ich vergessen. Ich hatte dieses Problem kürzlich und habe einen Workaround. Gib mir ein paar Minuten und ich werde die Antwort aktualisieren. – madjar
Hmm, habe die Version nicht gestartet, sorry. Nach dem Aufruf von 'setUp()' werden die Ergebnisse von 'datetime.datetime.now()' nicht durch das Setzen von 'self.time' beeinflusst. Vielleicht verstehe ich es immer noch falsch. – Alfe