Wie verspotte ich in Kontextmanagern verwendete Objekte mit unittest.mock?

DDD
Freigeben: 2024-10-20 16:27:29
Original
574 Leute haben es durchsucht

How to Mock Objects Used in Context Managers with unittest.mock?

So verspotten Sie ein in einem Kontextmanager verwendetes Objekt mit unittest.mock

Beim Testen von Code, der eine with-Anweisung verwendet, kann dies der Fall sein Es ist schwierig, das zugrunde liegende Objekt zu verspotten. Betrachten wir das folgende Beispiel:

def testme(filepath):
    with open(filepath) as f:
        return f.read()
Nach dem Login kopieren

Um diese Funktion mit unittest.mock zu testen, müssen wir die offene Funktion verspotten. So geht's:

Python 3:

  1. Patch von „builtins.open“ und verwende „mock_open“ von „unittest.mock“.
  2. Verwende „Patch“ als Kontext Manager oder Dekorateur. Übergeben Sie in beiden Fällen „mock_open“ mit den gewünschten Lesedaten und überprüfen Sie, ob die simulierte Datei mit den erwarteten Argumenten aufgerufen wird.

Python 2:

  1. Patch __builtin__.open anstelle vonbuiltins.open.
  2. Verwenden Sie „mock“ als Kontextmanager und übergeben Sie „mock_open“ wie zuvor.

Beispiel:

<code class="python">from unittest.mock import patch, mock_open

@patch("builtins.open", new_callable=mock_open, read_data="data")
def test_patch(mock_file):
    assert open("path/to/open").read() == "data"
    mock_file.assert_called_with("path/to/open")</code>
Nach dem Login kopieren

Denken Sie daran, dass in Python 3 der Patch das simulierte Objekt als Argument an Ihre Testfunktion übergibt, während Sie in Python 2 die simulierte Datei explizit bestätigen müssen.

Das obige ist der detaillierte Inhalt vonWie verspotte ich in Kontextmanagern verwendete Objekte mit unittest.mock?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage