mock - python unittest
Simulacros: ¿Cómo hago una excepción en la persona que llama? (1)
Supongamos que este es el código
def move(*args, **kwargs):
try:
shutil.move(source, destination)
except Exception as e:
raise e
y en mi tests.py
@patch.object(shutil, ''move'')
def test_move_catch_exception(self, mock_rmtree):
'''''' Tests moving a target hits exception. ''''''
mock_rmtree.side_effect = Exception(''abc'')
self.assertRaises(Exception, move,
self.src_f, self.src_f, **self.kwargs)
Dijo esto
File "unittests.py", line 84, in test_move_catch_exception
self.src_f, self.src_f, **self.kwargs)
AssertionError: Exception not raised
Si lo afirmo en mock_rmtree pasará. ¿Cómo puedo hacer valer a la persona que llama (en este caso, la función move )?
Como señaló aquavitae , las razones principales fue el error de copiar y pegar, y también estaba afirmando una tupla al principio. Siempre aseverar con el tipo de retorno correcto ...
Tienes un error tipográfico en tu ejemplo, falta un '' .
No está del todo claro lo que está preguntando, pero si lo entiendo correctamente, está preguntando cómo probar que una excepción elevada está atrapada dentro del move . Un problema es que está shutil.rmtree , no shutil.move , pero no puede estar seguro de que shutil.rmtree vez se llame a shutil.rmtree . shutil.move solo llama a shutil.rmtree si copia un directorio con éxito, pero como se está copiando self.src_f a sí mismo, esto no sucede. Sin embargo, esta no es una buena manera de parchearlo, ya que la suposición de que shutil.move llamará a shutil.rmtree no está garantizada y depende de la implementación.
En cuanto a cómo probarlo, simplemente verifique que el valor de retorno sea el esperado:
@patch.object(shutil, ''move'')
def test_move_catch_exception(self, mock_move):
'''''' Tests moving a target hits exception. ''''''
e = OSError(''abc'')
mock_move.side_effect = e
returns = move(self.src_f, self.src_f, **self.kwargs)
assert returns == (False, e)