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