Подтвердить что ты не робот

Mocking - Как я могу сделать исключение для вызывающего?

Предположим, что это код

def move(*args, **kwargs):   
    try:
        shutil.move(source, destination)
    except Exception as e:
        raise e

и в моих 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)

Он сказал это

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

Если я утвержу на mock_rmtree, он пройдет. Как я могу утверждать на вызывающем абоненте (в этом случае функция move)?


Как отметил aquavitae, основными причинами были ошибка копирования-вставки, а также я утверждал кортеж в начале. Всегда запрашивать правильный тип возврата...

4b9b3361

Ответ 1

У вас есть опечатка в вашем примере, отсутствует '.

Не совсем понятно, что вы просите, но если я правильно вас понимаю, вы спрашиваете, как проверить, что поднятое исключение попало внутрь move. Одна из проблем заключается в том, что вы исправляете shutil.rmtree, а не shutil.move, но не можете быть уверены, что shutil.rmtree когда-либо будет вызван. shutil.move только на самом деле вызывает shutil.rmtree, если он успешно копирует каталог, но поскольку вы копируете self.src_f для себя, этого не происходит. Это не очень хороший способ его исправления, потому что предположение, что shutil.move вызывает shutil.rmtree вообще, не гарантируется и зависит от реализации.

Как проверить его, просто проверьте, что возвращаемое значение соответствует ожидаемому:

@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)