[PYTHON] Ich möchte datetime.datetime.now () auch mit pytest verspotten!

TL; DR

Wenn Sie so verspotten, können Sie datetime.datetime.now () verspotten. Mit dieser Methode können andere Funktionen von datetime.datetime unverändert verwendet werden.

from unittest.mock import MagicMock

def test_mocking_datetime_now(monkeypatch):
    datetime_mock = MagicMock(wrap=datetime.datetime)
    datetime_mock.now.return_value = datetime.datetime(2020, 3, 11, 0, 0, 0)
    monkeypatch.setattr(datetime, "datetime", datetime_mock)

Hintergrund

Wenn Sie den Prozess zum Abrufen der aktuellen Uhrzeit testen, möchten Sie möglicherweise "datetime.datetime.now ()" verspotten. Selbst wenn Sie zu diesem Zeitpunkt einfach versuchen, mit "monkeypatch.setattr" zu verspotten, können Sie zu diesem Zeitpunkt nicht verspotten, da "datetime.datetime.now ()" integriert ist.

import datetime
from unittest.mock import MagicMock

FAKE_NOW = datetime.datetime(2020, 3, 11, 0, 0, 0)

def test_mocking_datetime_now_incorrect(monkeypatch):
    monkeypatch.setattr(datetime.datetime, "now", MagicMock(return_value=FAKE_NOW)
>       monkeypatch.setattr(datetime.datetime, "now", MagicMock(return_value="hoge"))
E       TypeError: can't set attributes of built-in/extension type 'datetime.datetime'

Also MagicMock (wrap = datetime.datetime)

Verwenden Sie daher "MagicMock (wrap = ...)". Sie können das zu verspottende Objekt im Wrap-Argument angeben und die erforderliche Methode verspotten, während Sie die normale Methode an das umschlossene Objekt weiterleiten.

from unittest.mock import MagicMock

def test_mocking_datetime_now(monkeypatch):
    # now()Nur verspottete datetime_Mock erstellen
    datetime_mock = MagicMock(wrap=datetime.datetime)
    datetime_mock.now.return_value = datetime.datetime(2020, 3, 11, 0, 0, 0)  #Jetzt jetzt()Spotten

    # datetime.Datum / Uhrzeit_Ersetzt durch Mock
    monkeypatch.setattr(datetime, "datetime", datetime_mock)

    #Unten Datum / Uhrzeit.datetime.now()Testen Sie mit

Extra

Top Antwort von stackoverflow war nicht cool, also war ich durcheinander [(beantwortet) habe ich](https://stackoverflow.com/a/ 60629703/7449523). Ich habe nicht darüber nachgedacht.

Mit der Top-Antwortmethode können Sie keine anderen Methoden von datetime.datetime aufrufen. Mit dieser Methode können Sie wie gewohnt "datetime.datetime.fromisoformat ()" oder andere Methoden aufrufen.

Übrigens besteht eine andere Lösung darin, "pytest-freezegun" zu verwenden, das eher einem Major ähnelt. Referenz: Aktueller Pytest-Zeittest (festes Datum und Uhrzeit) \ -Qiita

Recommended Posts

Ich möchte datetime.datetime.now () auch mit pytest verspotten!
Ich möchte ○○ mit Pandas machen
Ich möchte mit Python debuggen
Ich möchte Objekte mit OpenCV erkennen
Ich möchte einen Blog mit Jupyter Notebook schreiben
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte Rails mit Rails auch in einer vagabundierenden Umgebung betreiben
Verwenden Sie Mock mit Pytest
Ich möchte MATLAB feval mit Python verwenden
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte 100 Datenwissenschaften mit Colaboratory schlagen
Ich möchte ein Spiel mit Python machen
Ich möchte OREMO mit setParam sein!
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte -inf nicht mit np.log verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Ich möchte ip vrf mit SONiC verwenden
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte mit Djangos Migrate von vorne beginnen
Ich möchte mit Python in eine Datei schreiben
Ich möchte ein Bild mit Lollipop in WebP konvertieren
Selbst Anfänger möchten sagen "Ich verstehe Python voll und ganz"
Ich möchte die Optimierung mit Python und CPlex behandeln
Ich möchte mit verstärkendem Lernen einen Berg besteigen
Auch mit JavaScript möchte ich Python `range ()` sehen!
Ich möchte mit Python-Datenklasse nach hinten erben
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte eine Zeichenkette mit Hiragana teilen
Ich möchte in Python schreiben! (3) Verwenden Sie Mock
Ich möchte Lambda mit Python auf Mac AWS!
Ich möchte manuell eine Legende mit matplotlib erstellen
[TensorFlow] Ich möchte Fenster mit Ragged Tensor verarbeiten
Ich möchte einen Quantencomputer mit Python betreiben
Ich möchte eine lokale Variable mit Lambda binden
Ich möchte SUDOKU lösen
Ich möchte Daten mit Python analysieren können (Teil 3)
Ich möchte Pythons ungelöste Importwarnung mit vsCode entfernen
Ich möchte R-Funktionen einfach mit ipython notebook verwenden
Ich möchte eine andere Version von Python mit pyvenv angeben
Ich möchte Geschenke auch für mich selbst austauschen! [Weihnachten Hackason]
Ich möchte Daten mit Python analysieren können (Teil 1)
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich möchte eine Jupyter-Umgebung mit einem Befehl starten
[NetworkX] Ich möchte nach Knoten mit bestimmten Attributen suchen
Ich möchte ein Klickmakro mit pyautogui (Wunsch) erstellen.
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
Ich möchte Daten mit Python analysieren können (Teil 4)
Ich möchte mit GAN Schwarzweißfotos von Erinnerungen ausmalen
Ich möchte Daten mit Python analysieren können (Teil 2)
Ich möchte automatisch an Online-Kursen mit Python + Selen teilnehmen!
Ich möchte ein Klickmakro mit pyautogui (Outlook) erstellen.
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
[Visualisierung] Ich möchte mit Plotly ein schönes Diagramm zeichnen
Ich möchte die Effizienz mit Python auch in experimentellen Systemen verbessern (2) RS232C und pySerial