模拟 - 我如何在调用者处引发异常?

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指出的主要原因是复制粘贴错误,还有我一开始断言了一个元组。总是使用正确的返回类型进行断言...
1个回答

27

你的示例中有一个错别字,缺少了一个'

不太清楚你在问什么,但如果我理解正确的话,你是在询问如何测试在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)

2
非常感谢。我为混淆感到抱歉。这是一个复制粘贴错误,我没有注意到。是的,我正在修补移动而不是rmtree。我已经相应地编辑了帖子。你在这里是正确的,我很粗心。非常感谢。 - CppLearner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接