programacion - ¿Se burlan de los atributos en Python?
python ejemplo clases (3)
Estoy teniendo un momento bastante difícil de usar mock
en Python:
def method_under_test():
r = requests.post("http://localhost/post")
print r.ok # prints "<MagicMock name=''post().ok'' id=''11111111''>"
if r.ok:
return StartResult()
else:
raise Exception()
class MethodUnderTestTest(TestCase):
def test_method_under_test(self):
with patch(''requests.post'') as patched_post:
patched_post.return_value.ok = True
result = method_under_test()
self.assertEqual(type(result), StartResult,
"Failed to return a StartResult.")
La prueba realmente devuelve el valor correcto, pero r.ok
es un objeto r.ok
, no True
. ¿Cómo te burlas de los atributos en la biblioteca mock
de Python?
Con la versión simulada ''1.0.1'', la sintaxis más simple mencionada en la pregunta es compatible y funciona como está.
Código de ejemplo actualizado (se usa py.test en lugar de unittest):
import mock
import requests
def method_under_test():
r = requests.post("http://localhost/post")
print r.ok
if r.ok:
return r.ok
else:
raise Exception()
def test_method_under_test():
with mock.patch(''requests.post'') as patched_post:
patched_post.return_value.ok = True
result = method_under_test()
assert result is True, "mock ok failed"
Ejecute este código con: (asegúrese de instalar Pytest)
$ py.test -s -v mock_attributes.py
======= test session starts =======================
platform linux2 -- Python 2.7.10 -- py-1.4.30 -- pytest-2.7.2 -- /home/developer/miniconda/bin/python
rootdir: /home/developer/projects/learn/scripts/misc, inifile:
plugins: httpbin, cov
collected 1 items
mock_attributes.py::test_method_under_test True
PASSED
======= 1 passed in 0.03 seconds =================
Necesitas usar return_value
y PropertyMock
:
with patch(''requests.post'') as patched_post:
type(patched_post.return_value).ok = PropertyMock(return_value=True)
Esto significa que: al llamar a requests.post
, en el valor de retorno de esa llamada, establezca un PropertyMock
para la propiedad ok
para devolver el valor True
.
Una forma compacta y simple de hacerlo es usar el new_callable
patch
para forzar que patch
use PropertyMock
lugar de MagicMock
para crear el objeto simulado. Los otros argumentos pasados al patch
se usarán para crear el objeto PropertyMock
.
with patch(''requests.post'', new_callable=PropertyMock, return_value=True) as mock_post:
"""Your test"""