TL; DR
Si vous vous moquez de cette façon, vous pouvez vous moquer de datetime.datetime.now ()
. Avec cette méthode, d'autres fonctions de datetime.datetime
peuvent être utilisées telles quelles.
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)
Lors du test du processus d'obtention de l'heure actuelle, vous voudrez peut-être vous moquer de datetime.datetime.now ()
. Pour le moment, même si vous essayez simplement de vous moquer de monkeypatch.setattr
, vous ne pouvez pas vous moquer car datetime.datetime.now ()
est intégré.
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'
Par conséquent, utilisez MagicMock (wrap = ...)
. Vous pouvez spécifier l'objet à simuler dans l'argument wrap et simuler la méthode requise tout en faisant passer la méthode normale à l'objet enveloppé.
from unittest.mock import MagicMock
def test_mocking_datetime_now(monkeypatch):
# now()Seulement datetime simulé_Créer une maquette
datetime_mock = MagicMock(wrap=datetime.datetime)
datetime_mock.now.return_value = datetime.datetime(2020, 3, 11, 0, 0, 0) #Maintenant maintenant()Moquer
# datetime.datetime à datetime_Remplacé par simulacre
monkeypatch.setattr(datetime, "datetime", datetime_mock)
#Ci-dessous, datetime.datetime.now()Test en utilisant
Réponse principale de stackoverflow n'était pas cool, donc j'étais foiré [(répondu) je l'ai fait](https://stackoverflow.com/a/ 60629703/7449523). Je n'y ai pas réfléchi.
Avec la méthode de réponse supérieure, vous ne pouvez pas appeler d'autres méthodes de datetime.datetime. Avec cette méthode, vous pouvez appeler datetime.datetime.fromisoformat ()
ou d'autres méthodes comme d'habitude.
À propos, une autre solution consiste à utiliser «pytest-freezegun», qui ressemble plus à un major. Référence: Test de l'heure actuelle Pytest (date et heure fixes) \ -Qiita
Recommended Posts