unittest mock python unit-testing mocking

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)