嘲笑-如何在调用方上引发异常?

2024-04-27 04:46:37 发布

您现在位置:Python中文网/ 问答频道 /正文

假设这是代码

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

在我的测试中

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


Tags: 代码testselfsrcmovedefexceptionargs
1条回答
网友
1楼 · 发布于 2024-04-27 04:46:37

您的示例中有一个输入错误,缺少一个'

现在还不完全清楚你在问什么,但是如果我理解正确的话,你在问如何测试引发的异常是否在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)

相关问题 更多 >