Maison  >  Article  >  développement back-end  >  Comment se moquer des objets utilisés dans les gestionnaires de contexte avec unittest.mock ?

Comment se moquer des objets utilisés dans les gestionnaires de contexte avec unittest.mock ?

DDD
DDDoriginal
2024-10-20 16:27:29459parcourir

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

Comment se moquer d'un objet utilisé dans un gestionnaire de contexte avec unittest.mock

Lors du test d'un code qui utilise une instruction with, cela peut être difficile de se moquer de l’objet sous-jacent. Considérons l'exemple suivant :

def testme(filepath):
    with open(filepath) as f:
        return f.read()

Pour tester cette fonction avec unittest.mock, nous devons nous moquer de la fonction open. Voici comment :

Python 3 :

  1. Corrigez buildins.open et utilisez mock_open à partir de unittest.mock.
  2. Utilisez le patch comme contexte gérant ou décorateur. Dans les deux cas, transmettez mock_open avec les données de lecture souhaitées et vérifiez que le fichier simulé est appelé avec les arguments attendus.

Python 2 :

  1. Patch __builtin__.open au lieu de buildins.open.
  2. Utilisez mock comme gestionnaire de contexte et transmettez mock_open comme avant.

Exemple :

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

N'oubliez pas que dans Python 3, le patch transmettra l'objet simulé comme argument à votre fonction de test, tandis que dans Python 2, vous devez affirmer explicitement le fichier simulé.

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