unitarias - test en python
Burlarse de dos funciones con parche para una prueba de unidad (3)
Además de la respuesta @Matti John, también puedes usar el patch
dentro de la función test_write_out
:
from mock import MagicMock, patch
def test_write_out():
path = ''~/collection''
with patch(''__builtin__.open'') as mock_open, /
patch(''cPickle.dump'') as mock_pickle:
f = mock_open.return_value
...
Tengo una función que quiero que la prueba unitaria contenga llamadas otras dos funciones. No estoy seguro de cómo puedo simular ambas funciones al mismo tiempo utilizando correctamente el parche. He proporcionado un ejemplo de lo que quiero decir a continuación. Cuando realizo pruebas de nariz, las pruebas pasan pero creo que debe haber una manera más limpia de hacerlo y realmente no entiendo la pieza con respecto a f.close () ...
La estructura del directorio se ve así:
program/
program/
data.py
tests/
data_test.py
data.py:
import cPickle
def write_out(file_path, data):
f = open(file_path, ''wb'')
cPickle.dump(data, f)
f.close()
data_test.py:
from mock import MagicMock, patch
def test_write_out():
path = ''~/collection''
mock_open = MagicMock()
mock_pickle = MagicMock()
f_mock = MagicMock()
with patch(''__builtin__.open'', mock_open):
f = mock_open.return_value
f.method.return_value = path
with patch(''cPickle.dump'', mock_pickle):
write_out(path, ''data'')
mock_open.assert_called_once_with(''~/collection'', ''wb'')
f.close.assert_any_call()
mock_pickle.assert_called_once_with(''data'', f)
Resultados:
$ nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.008s
OK
Aquí hay un ejemplo simple sobre cómo probar el aumento de ConflictError
en la función create_collection
usando mock:
import os
from unittest import TestCase
from mock import patch
from ..program.data import ConflictError, create_collection
class TestCreateCollection(TestCase):
def test_path_exists(self):
with patch.object(os.path, ''exists'') as mock_method:
mock_method.return_value = True
self.assertRaises(ConflictError, create_collection, ''test'')
Por favor, también vea documentos falsos y la increíble presentación de Michael Foord para burlarse .
Puede simplificar su prueba utilizando el decorador de parches y MagicMock
manera (son objetos MagicMock
por defecto):
@patch(''cPickle.dump'')
@patch(''__builtin__.open'')
def test_write_out(mock_open, mock_pickle):
path = ''~/collection''
f = mock_open.return_value
f.method.return_value = path
write_out(path, ''data'')
mock_open.assert_called_once_with(''~/collection'', ''wb'')
mock_pickle.assert_called_once_with(''data'', f)
f.close.assert_any_call()
Las llamadas a una instancia de MagicMock
devuelven una nueva instancia de MagicMock
, por lo que puede verificar que el valor devuelto se haya llamado igual que cualquier otro objeto burlado. En este caso f
es un MagicMock
llamado ''open()''
(intente imprimir f
).