Python 模拟-如何对调用方引发异常?

Python 模拟-如何对调用方引发异常?,python,unit-testing,mocking,Python,Unit Testing,Mocking,假设这是代码 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 hi

假设这是代码

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\u rmtree
上断言,它将通过。如何在调用者上断言(在本例中是函数
move



正如aquavitae指出的,主要原因是复制粘贴错误,而且我在一开始就断言了一个元组。始终使用正确的返回类型进行断言…

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

现在还不完全清楚您在问什么,但如果我理解正确,您是在问如何测试在
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)

非常感谢你。我为这些困惑道歉。这是一个复制粘贴错误,我没有发现。是的,我正在修补移动而不是rmtree。我据此编辑了这篇文章。你说得对,我在这里不小心。谢谢。