Ich muss einen Komponententest für eine Funktion schreiben, die ein Wörterbuch zurückgibt. Einer der Werte in diesem Wörterbuch ist datetime.datetime.now()
, der sich natürlich bei jedem Testlauf ändert.Wörterbücher mit flüchtigen Werten in Python-Unit-Tests?
Ich möchte diesen Schlüssel vollständig in meiner Behauptung ignorieren. Im Moment habe ich ein Wörterbuch Vergleichsfunktion, aber ich möchte wirklich verwenden assertEqual wie folgt aus:
def my_func(self):
return {'monkey_head_count': 3, 'monkey_creation': datetime.datetime.now()}
... unit tests
class MonkeyTester(unittest.TestCase):
def test_myfunc(self):
self.assertEqual(my_func(), {'monkey_head_count': 3}) # I want to ignore the timestamp!
Gibt es eine Best Practices oder elegante Lösungen für dies zu tun? Ich bin mir bewusst, assertAlmostEqual()
, aber das ist nur nützlich für Floats Iirc.
Warum habe ich nicht an diese einfache Lösung gedacht? Obwohl ich viele mögliche Rückgabewerte von my_func testen werde, denke ich, dass ich monateypatch datetime wie Sie vorgeschlagen haben. Viel geschätzt, wirklich schlau! – pojo
Sie sollten Code setzen, um die Datetime in einer Teardown-Methode zurückzusetzen - so hat dieser Unit Test keine Auswirkungen auf andere Testklassen –
Eine andere Option ist es, datetime.datetime.now als Standard für einen benannten Parameter zu übergeben; Übergeben Sie Ihre eigene Funktion im Komponententest. Dies vermeidet Monkeypatching. –