mock_open
fait partie du mock
framework et est très simple à utiliser. patch
utilisé comme contexte renvoie l'objet utilisé pour remplacer celui qui a été corrigé: vous pouvez l'utiliser pour simplifier votre test.
Python 3.x
Utilisez à la builtins
place de __builtin__
.
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")
Python 2.7
mock
ne fait pas partie de unittest
et vous devriez patcher__builtin__
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")
Coffret décorateur
Si vous patch
utilisiez comme décorateur en utilisant mock_open()
le résultat de s comme new
patch
argument de s, cela peut être un peu bizarre.
Dans ce cas, il est préférable d 'utiliser l new_callable
patch
' argument s et de se rappeler que tous les arguments supplémentaires qui patch
ne sont pas utilisés seront passés à la new_callable
fonction comme décrit dans la patch
documentation .
patch () prend des arguments de mot-clé arbitraires. Ceux-ci seront transmis au Mock (ou new_callable) lors de la construction.
Par exemple, la version décorée pour Python 3.x est:
@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")
N'oubliez pas que dans ce cas patch
, vous ajouterez l'objet fictif comme argument de votre fonction de test.