resueltos programacion poo orientada objetos instancia importar herencia ejercicios ejemplo definir clases atributos python unit-testing testing mocking python-mock

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