Heim  >  Artikel  >  Backend-Entwicklung  >  Wie verspotte ich in Kontextmanagern verwendete Objekte mit unittest.mock?

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

DDD
DDDOriginal
2024-10-20 16:27:29461Durchsuche

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

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>

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!

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