Un mémorandum sur le simulacre de Python

L'autre jour, j'ai été troublé par le simulacre de Python, alors je vais laisser un mémorandum.

Document officiel pour le moment

[unittest.mock --- Bibliothèque d'objets simulés] (https://docs.python.org/ja/3/library/unittest.mock.html) [unittest.mock --- Introduction] (https://docs.python.org/ja/3/library/unittest.mock-examples.html)

Il était officiellement écrit que j'étais inquiet environ 2 heures. La formule est géniale

demandes simulées.

tori01.py


import requests

def get_qiita(url):
    response = requests.get(url)
    return response

Obtenez simplement l'URL et renvoyez la réponse renvoyée

test_tori01.py


import unittest
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    @patch("tori01.requests.get")
    def test_get_response(self, requests_get):
        requests_get.return_value.status_code = 200

        res = tori01.get_response("mock.url")
        self.assertEqual(res.status_code, 200)

Vérification des assertions avec code d'état Cette fois sur la base de ces codes

autour du patch

Puisque requests est importé dans tori01.py Corrigé avec @ patch (" tori01.requests.get ")

S'il s'agit de tori01.py et que requests.get est importé Il ne sera pas patché sauf si vous faites @ patch (" tori01.get ")

tori01.py


#Modifié par rapport aux demandes d'importation
from requests import get

def get_response(url):
    response = get(url)
    return response

test_tori01.py


import unittest
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    # @patch("tori01.requests.get")Changer de
    @patch("tori01.get")
    def test_get_response(self, requests_get):
        requests_get.return_value.status_code = 200

        res = tori01.get_response("mock.url")
        self.assertEqual(res.status_code, 200)

Si vous voulez vous moquer de «requests» au lieu de «requests.get» (ce qui est légitime)

test_tori01.py


import unittest
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    # @patch("tori01.requests.get")Changer de
    #La dénomination des arguments est également des requêtes.Passer des demandes d'accès aux demandes
    @patch("tori01.requests")
    def test_get_response(self, requests):
        # requests_get.return_value.status_code =Changé de 200
        requests.get.return_value.status_code = 200

        res = tori01.get_response("mock.url")
        self.assertEqual(res.status_code, 200)

Appeler une fonction

Vous pouvez vérifier l'argument lorsqu'il est appelé.

test_tori01.py


import unittest
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    @patch("tori01.requests.get")
    def test_get_response(self, requests_get):

        #Créez une fonction qui retourne mock pour pouvoir l'appeler.
        def requests_get_mock(url):
            return Mock(status_code = 200, url = url)

        requests_get.side_effect = requests_get_mock

        res = tori01.get_response("mock.url")
        self.assertEqual(res.status_code, 200)
        self.assertEqual(res.url, "mock.url")

Vous pouvez vérifier avec ʻassert_called_with` sans faire ce tour-point. Il existe divers autres systèmes d'assert

test_tori01.py


import unittest
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    @patch("tori01.requests.get")
    def test_get_response(self, requests_get):
        requests_get.return_value.status_code = 200

        res = tori01.get_response("mock.url")
        self.assertEqual(res.status_code, 200)
        requests_get.assert_called_with("mock.url") #ajouter à

Changer la valeur de retour en fonction de l'argument

test_tori01.py


import unittest
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    @patch("tori01.requests.get")
    def test_get_response(self, requests_get):

        vals = {"mock.url":200, "error_mock.url":404}
        def requests_get_mock(val):
            return Mock(status_code = vals[val])

        requests_get.side_effect = requests_get_mock

        res = tori01.get_response("mock.url")
        res_error = tori01.get_response("error_mock.url")
        self.assertEqual(res.status_code, 200)
        self.assertEqual(res_error.status_code, 404)

Vous pouvez également lever des exceptions

test_tori01.py


import unittest
import requests
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    @patch("tori01.requests.get")
    def test_get_response(self, requests_get):

        # side_Si vous définissez une classe d'exception pour l'effet, une exception sera levée
        requests_get.side_effect = requests.HTTPError

        with self.assertRaises(requests.HTTPError):
            tori01.get_response("mock.url")

Je peux l'ajouter ou écrire la partie 2

Maquette magique ...

Recommended Posts

Un mémorandum sur le simulacre de Python
Mémorandum sur la corrélation [Python]
Une note sur mock (bibliothèque fictive Python)
Un mémorandum sur la bibliothèque de wrapper Python tesseract
fonction de mémorandum python pour débutant
Une note sur [python] __debug__
Mémorandum Python
Mémorandum Python 2
Mémorandum Python
mémorandum python
mémorandum python
Mémorandum Python
mémorandum python
Mémorandum Python
Python: une note sur les classes 1 "Résumé"
[Python] Un mémorandum de belle soupe4
À propos des tranches Python
Mémorandum de base Python
Mémorandum de Python Pathlib
Mémorandum Python (algorithme)
À propos du rendement Python
À propos de python, classe
Mémorandum des débutants en python
Un programmeur Java a étudié Python. (À propos du type)
Mémorandum sur le QueryDict de Django
À propos de Python Decorator
Une histoire sur Python pop and append
Mémorandum Python [liens]
Mémorandum de base Python Partie 3-A propos de l'orientation des objets-
À propos de la référence Python
À propos des décorateurs Python
[Python] À propos du multi-processus
Mémorandum sur la validation
À propos du 02 février 2020 * Ceci est un article Python.
Mémorandum du processus de suppression de chaîne python
Un programmeur Java a étudié Python. (À propos des fonctions (méthodes))
Un programmeur Java a étudié Python. (À propos des décorateurs)
Un mémorandum sur l'appel de Python à partir de Common Lisp
Argument de variable Python Un mémorandum lors de l'héritage d'une classe définie
Un mémo que j'ai écrit un tri de fusion en Python
Écrire une note sur la version python de python virtualenv
Analyse de données en Python: une note sur line_profiler
Un mémorandum pour toucher Python Flask avec Heroku
Une histoire sur la modification de Python et l'ajout de fonctions
À propos de Python for loop
Variables de numérotation des mémorandums Python
Algorithme A * (édition Python)
À propos des arguments de fonction (python)
[Python] Prenez une capture d'écran
mémorandum python (mise à jour séquentielle)
Créer un module Python
expression lambda de python ...
[Python] Mémo sur les fonctions
Résumé sur Python3 + OpenCV3
À propos de Python, pour ~ (plage)
Mémorandum Python (signet personnel)
Démoniser un processus Python
[Python] Mémo sur les erreurs