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!