19

假设这是代码

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指出的那样,主要原因是复制粘贴错误,而且我一开始就断言了一个元组。始终断言正确的返回类型...

4

1 回答 1

27

您的示例中有错字,缺少'.

它并不完全清楚你在问什么,但如果我理解正确,你问的是如何测试引发的异常是否被捕获 inside 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)
于 2012-04-25T06:37:23.240 回答