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

时间:2012-04-25 03:52:20

标签: python unit-testing 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 所指出的,主要原因是复制粘贴错误,而且我在开始时声明了一个元组。始终使用正确的返回类型...

1 个答案:

答案 0 :(得分:27)

你的例子中有一个拼写错误,错过了'

你所要求的并不完全清楚,但如果我理解正确,你就会问如何测试move内是否有一个引发异常的问题。一个问题是,您正在修补shutil.rmtree,而不是shutil.move,但您无法确定是否会调用shutil.rmtreeshutil.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)