Maison  >  Article  >  développement back-end  >  Comment simuler des fichiers ouverts en Python Unittest.Mock ?

Comment simuler des fichiers ouverts en Python Unittest.Mock ?

Linda Hamilton
Linda Hamiltonoriginal
2024-10-20 16:27:02383parcourir

How to Mock Open Files in Python Unittest.Mock?

Se moquer des fichiers ouverts dans Python Unittest.Mock

Lors du test du code Python qui utilise des opérations sur les fichiers, il est essentiel de se moquer efficacement du comportement des fichiers ouverts . Un scénario spécifique se produit lorsque open est utilisé dans une instruction with, comme le montre le code suivant :

<code class="python">def testme(filepath):
    with open(filepath) as f:
        return f.read()</code>

Python 3

Pour simuler cette opération open, utilisez unittest.mock en conjonction avec mock_open, qui fait partie du framework mock. patch sert de gestionnaire de contexte, renvoyant l'objet utilisé pour remplacer celui corrigé :

<code class="python">from unittest.mock import patch, mock_open
with patch("builtins.open", mock_open(read_data="data")) as mock_file:
    assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")</code>

Alternativement, patch peut être utilisé comme décorateur. Cependant, utiliser le résultat de mock_open() comme nouvel argument peut être fastidieux. Utilisez plutôt l'argument new_callable de patch et rappelez-vous que les arguments supplémentaires non utilisés par patch seront transmis à la fonction new_callable :

<code class="python">@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>

Notez que patch fournira l'objet simulé comme argument à la fonction de test dans ce cas. .

Python 2

Pour Python 2, il est nécessaire de patcher __builtin__.open à la place et d'importer le mock séparément :

<code class="python">from mock import patch, mock_open
with patch("__builtin__.open", mock_open(read_data="data")) as mock_file:
    assert open("path/to/open").read() == "data"
mock_file.assert_called_with("path/to/open")</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn