Ein Memorandum über den Python-Mock

Neulich war ich von Pythons Mock beunruhigt, deshalb werde ich ein Memorandum hinterlassen.

Offizielles Dokument vorerst

[unittest.mock --- Mock Object Library] (https://docs.python.org/ja/3/library/unittest.mock.html) [unittest.mock --- Einführung] (https://docs.python.org/ja/3/library/unittest.mock-examples.html)

Es wurde offiziell geschrieben, dass ich mir über 2 Stunden Sorgen machte. Die Formel ist großartig

Scheinanfragen.get

tori01.py


import requests

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

Holen Sie sich einfach mit URL und geben Sie die zurückgegebene Antwort zurück

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)

Assertionsprüfung mit Statuscode Diesmal basierend auf diesen Codes

um Patch

Da Anfragen in tori01.py importiert wird Gepatcht mit @ patch (" tori01.requests.get ")

Wenn dies "tori01.py" ist und "request.get" importiert wird Es wird nur gepatcht, wenn Sie "@ patch (" tori01.get ")" ausführen

tori01.py


#Von Importanforderungen geändert
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")Wechsel von
    @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)

Wenn Sie "Anfragen" anstelle von "Anfragen" verspotten möchten (was legitim ist)

test_tori01.py


import unittest
from mock import Mock, patch

import tori01

class TestTori01(unittest.TestCase):

    # @patch("tori01.requests.get")Wechsel von
    #Die Benennung von Argumenten ist ebenfalls eine Anforderung.Wechseln Sie von get zu Anfragen
    @patch("tori01.requests")
    def test_get_response(self, requests):
        # requests_get.return_value.status_code =Geändert von 200
        requests.get.return_value.status_code = 200

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

Rufen Sie eine Funktion auf

Sie können das Argument überprüfen, wenn es aufgerufen wird.

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

        #Erstellen Sie eine Funktion, die mock zurückgibt, damit sie aufgerufen werden kann.
        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")

Sie können mit `assert_called_with` nachsehen, ohne diesen Kreisverkehr zu machen. Es gibt verschiedene andere Assert-Systeme

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") #hinzufügen

Ändern Sie den Rückgabewert abhängig vom 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)

Sie können auch Ausnahmen auslösen

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_Wenn Sie eine Ausnahmeklasse für den Effekt festlegen, wird eine Ausnahme ausgelöst
        requests_get.side_effect = requests.HTTPError

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

Ich kann es hinzufügen oder Teil 2 schreiben

Magic Mock ...

Recommended Posts

Ein Memorandum über den Python-Mock
Memorandum über Korrelation [Python]
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Ein Memorandum über die Python-Tesseract-Wrapper-Bibliothek
Python-Anfänger-Memorandum-Funktion
Ein Hinweis zu [Python] __debug__
Python-Memorandum
Python-Memorandum 2
Python-Memorandum
Python Memorandum
Python Memorandum
Python-Memorandum
Python Memorandum
Python-Memorandum
Python: Ein Hinweis zu Klasse 1 "Abstract"
[Python] Ein Memorandum der schönen Suppe4
Über Python-Slices
Python-Grundmemorandum
Python Pathlib Memorandum
Python-Memorandum (Algorithmus)
Über die Python-Ausbeute
Über Python, Klasse
Memorandum von Python-Anfängern
Ein Java-Programmierer studierte Python. (Über Typ)
Memorandum zu Djangos QueryDict
Über Python Decorator
Eine Geschichte über Python Pop und Append
Python-Memorandum [Links]
Python Basic Memorandum Teil 3 - Informationen zur Objektorientierung
Informationen zur Python-Referenz
Über Python-Dekorateure
[Python] Über Multi-Prozess
Memorandum über die Validierung
Über den 02. Februar 2020 * Dies ist ein Python-Artikel.
Memorandum zum Löschen von Python-Strings
Ein Java-Programmierer studierte Python. (Über Funktionen (Methoden))
Ein Java-Programmierer studierte Python. (Über Dekorateure)
Ein Memorandum zum Aufrufen von Python aus Common Lisp
Python-Variablenargument Ein Memorandum beim Erben einer definierten Klasse
Ein Memo, das ich in Python zusammengeführt habe
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Datenanalyse in Python: Ein Hinweis zu line_profiler
Ein Memorandum zum Berühren von Python Flask mit Heroku
Eine Geschichte über das Ändern von Python und das Hinzufügen von Funktionen
Über Python für Schleife
Python-Memorandum-Nummerierungsvariablen
Ein * Algorithmus (Python Edition)
Über Funktionsargumente (Python)
[Python] Machen Sie einen Screenshot
Python Memorandum (sequentielle Aktualisierung)
Erstellen Sie ein Python-Modul
Pythons Lambda-Ausdruck ...
[Python] Memo über Funktionen
Zusammenfassung über Python3 + OpenCV3
Über Python für ~ (Bereich)
Python-Memorandum (persönliches Lesezeichen)
Dämonisiere einen Python-Prozess
[Python] Memo Über Fehler