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)
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'
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
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