mock python mocking python-unittest python-mock

python - pytest mock



¿Cómo te burlas de parchar una clase de python y obtienes un nuevo objeto Mock para cada instanciación? (1)

DE ACUERDO,
Sé que esto se menciona en el manual , y probablemente tenga que ver con side_effect y / o return_value , pero un ejemplo simple y directo me ayudará enormemente.

Yo tengo:

class ClassToPatch(): def __init__(self, *args): _do_some_init_stuff() def some_func(): _do_stuff() class UUT(): def __init__(self, *args) resource_1 = ClassToPatch() resource_2 = ClassToPatch()

Ahora, quiero hacer una prueba unitaria de la clase ClassToPatch y ClassToPatch el ClassToPatch . Sabiendo que la clase ClassToPatch instanciará exactamente dos objetos ClassToPatch , quiero que el marco de simulacros devuelva un nuevo objeto de simulacro para cada instanciación, de modo que luego pueda hacer valer las llamadas por separado.

¿Cómo puedo lograr esto utilizando el decorador @patch en un caso de prueba? A saber, ¿cómo arreglar el siguiente ejemplo de código?

class TestCase1(unittest.TestCase): @patch(''classToPatch.ClassToPatch'',autospec=True) def test_1(self,mock1,mock2): _assert_stuff()


Aquí hay un ejemplo rápido para ponerte en marcha:

import mock import unittest class ClassToPatch(): def __init__(self, *args): pass def some_func(self): return id(self) class UUT(): def __init__(self, *args): resource_1 = ClassToPatch() resource_2 = ClassToPatch() self.test_property = (resource_1.some_func(), resource_2.some_func()) class TestCase1(unittest.TestCase): @mock.patch(''__main__.ClassToPatch'', autospec = True) def test_1(self, mock1): ctpMocks = [mock.Mock(), mock.Mock()] ctpMocks[0].some_func.return_value = "funky" ctpMocks[1].some_func.return_value = "monkey" mock1.side_effect = ctpMocks u = UUT() self.assertEqual(u.test_property, ("funky", "monkey")) if __name__ == ''__main__'': unittest.main()

He añadido test_property a test_property para que la prueba de la unidad haga algo útil. Ahora, sin el simulacro test_property debería ser una tupla que contenga los identificadores de las dos instancias de ClassToPatch . Pero con el simulacro debería ser la tupla: ("funky", "monkey") .

He usado la propiedad side_effect del objeto simulado para que se devuelva una instancia diferente de ClassToPatch en cada llamada en el inicializador UUT .

Espero que esto ayude.

Edit: Ah, por cierto, cuando ejecuto la prueba de la unidad obtengo:

. ---------------------------------------------------------------------- Ran 1 test in 0.004s OK