2012-04-25 15 views
18

Supongamos que este es el códigoBurlándose: ¿cómo hago una excepción en la persona que llama?

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) 

Se dijo que este

File "unittests.py", line 84, in test_move_catch_exception 
    self.src_f, self.src_f, **self.kwargs) 
AssertionError: Exception not raised 

Si afirmo en mock_rmtree pasará. ¿Cómo puedo afirmar en la persona que llama (en este caso, la función move)?


Como aquavitae señaló, las principales razones fue el error de copiar y pegar, y yo también estaba afirmando una tupla en el principio. Siempre assert con el tipo de retorno correcto ...

Respuesta

26

Tiene un error tipográfico en su ejemplo, falta un '.

No está del todo claro lo que estás preguntando, pero si te entiendo correctamente, estás preguntando cómo probar que una excepción planteada está atrapada dentro de move. Un problema es que está parcheando shutil.rmtree, no shutil.move, pero no puede estar seguro de que se llame al shutil.rmtree. shutil.move solo llama al shutil.rmtree si copia correctamente un directorio, pero como está copiando self.src_f a sí mismo, esto no sucede. Sin embargo, esta no es una muy buena manera de parchear, porque la suposición de que shutil.move llamará al shutil.rmtree no está garantizada y depende de la implementación.

En cuanto a la forma de probarlo, basta con comprobar que el valor de retorno es 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) 
+2

Muchas gracias. Me disculpé por las confusiones. Fue un error de copiar y pegar que no capté. Sí, estoy parcheando mover en lugar de rmtree. Edité la publicación en consecuencia. Estás en lo correcto acerca de mi descuido aquí. Muchas gracias. – CppLearner

Cuestiones relacionadas