Python | Parcheo de objetos de prueba unitaria | Serie 1

El problema es escribir pruebas unitarias y es necesario aplicar parches a los objetos seleccionados para hacer afirmaciones sobre cómo se usaron en la prueba (por ejemplo, afirmaciones sobre ser llamado con ciertos parámetros, acceso a atributos seleccionados, etc.).

Para ello, la unittest.mock.patch()función se puede utilizar para ayudar con este problema. Es un poco inusual, pero patch()se puede usar como decorador, administrador de contexto o independiente.

Código #1: Uso unittest.mock.patchcomo decorador

from unittest.mock import patch
import example
@patch('example.func')
  
def test1(x, mock_func):
    # Uses patched example.func
    example.func(x) 
    mock_func.assert_called_with(x)

 
Código #2: Usar unittest.mock.patchcomo decorador

with patch('example.func') as mock_func:
    example.func(x) 
    mock_func.assert_called_with(x)

 
Código #3: Usar unittest.mock.patchpara parchear cosas manualmente.

p = patch('example.func')
mock_func = p.start()
example.func(x)
mock_func.assert_called_with(x)
p.stop()

 
Código n.° 4: apilar decoradores y administradores de contexto para parchear varios objetos

@patch('example.func1')
@patch('example.func2')
@patch('example.func3')
  
def test1(mock1, mock2, mock3):
    ...
def test2():
    with patch('example.patch1') as mock1, \
    patch('example.patch2') as mock2, \
    patch('example.patch3') as mock3:
    ...

patch()funciona tomando un objeto existente con el nombre completo que proporciona y reemplazándolo con un nuevo valor. Luego, el valor original se restaura después de completar la función decorada o el administrador de contexto. De forma predeterminada, los valores se reemplazan con instancias de MagicMock.
 
Código #5: Ejemplo

x = 42
with patch('__main__.x'):
    print(x)
  
print (x)

Producción :

<MagicMock name='x' id='4314230032'>
42

Publicación traducida automáticamente

Artículo escrito por manikachandna97 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *