[PYTHON] Je veux moquer datetime.datetime.now () même avec pytest!

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)

Contexte

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'

Donc MagicMock (wrap = 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

Supplémentaire

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

Je veux moquer datetime.datetime.now () même avec pytest!
Je veux faire ○○ avec les Pandas
Je veux déboguer avec Python
Je veux détecter des objets avec OpenCV
Je veux écrire un blog avec Jupyter Notebook
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je veux utiliser des rails avec des rails même dans un environnement vagabond
Utilisez Mock avec pytest
Je veux utiliser MATLAB feval avec python
Je souhaite afficher plusieurs images avec matplotlib.
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
Je veux être OREMO avec setParam!
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
#Unresolved Je veux compiler gobject-introspection avec Python3
Je souhaite utiliser ip vrf avec SONiC
Je veux résoudre APG4b avec Python (chapitre 2)
Je veux recommencer avec Migrate de Django
Je veux écrire dans un fichier avec Python
Je veux convertir une image en WebP avec sucette
Même les débutants veulent dire "Je comprends parfaitement Python"
Je veux gérer l'optimisation avec python et cplex
Je veux escalader une montagne avec l'apprentissage par renforcement
Même avec JavaScript, je veux voir Python `range ()`!
Je veux hériter de l'arrière avec la classe de données python
Je veux travailler avec un robot en python.
Je veux diviser une chaîne de caractères avec hiragana
Je veux écrire en Python! (3) Utiliser des simulacres
Je veux AWS Lambda avec Python sur Mac!
Je souhaite créer manuellement une légende avec matplotlib
[TensorFlow] Je souhaite traiter des fenêtres avec Ragged Tensor
Je veux faire fonctionner un ordinateur quantique avec Python
Je veux lier une variable locale avec lambda
Je veux résoudre SUDOKU
Je veux pouvoir analyser des données avec Python (partie 3)
Je souhaite supprimer l'avertissement d'importation non résolue de Python avec vsCode
Je souhaite utiliser facilement les fonctions R avec le notebook ipython
Je souhaite spécifier une autre version de Python avec pyvenv
Je veux échanger des cadeaux même pour moi! [Christmas Hackason]
Je veux pouvoir analyser des données avec Python (partie 1)
Je veux créer un éditeur de blog avec l'administrateur de django
Je veux démarrer un environnement Jupyter avec une seule commande
[NetworkX] Je souhaite rechercher des nœuds avec des attributs spécifiques
Je veux faire une macro de clic avec pyautogui (désir)
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
Je veux pouvoir analyser des données avec Python (partie 4)
Je veux colorier des photos en noir et blanc de souvenirs avec GAN
Je veux pouvoir analyser des données avec Python (partie 2)
Je veux assister automatiquement à des cours en ligne avec Python + Selenium!
Je veux faire une macro de clic avec pyautogui (Outlook)
[Python] Je souhaite utiliser l'option -h avec argparse
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Je veux installer le package de requirements.txt avec poésie
[Visualisation] Je veux dessiner un beau graphique avec Plotly
Je souhaite améliorer l'efficacité avec Python même dans les systèmes expérimentaux (2) RS232C et pySerial