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

Cpp*_*ner 19 python unit-testing mocking

假设这是代码

def move(*args, **kwargs):   
    try:
        shutil.move(source, destination)
    except Exception as e:
        raise e
Run Code Online (Sandbox Code Playgroud)

在我的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)
Run Code Online (Sandbox Code Playgroud)

它说这个

  File "unittests.py", line 84, in test_move_catch_exception
    self.src_f, self.src_f, **self.kwargs)
AssertionError: Exception not raised
Run Code Online (Sandbox Code Playgroud)

如果我坚持mock_rmtree就会通过.如何在调用者上断言(在本例中为函数move)?


aquavitae所指出的,主要原因是复制粘贴错误,而且我在开始时也断言了一个元组.始终使用正确的返回类型...

aqu*_*tae 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)
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢.我为这些混乱道歉.这是一个我没有抓到的复制粘贴错误.是的我正在修补移动而不是rmtree.我相应地编辑了这篇文章.你对我的粗心大意是正确的.非常感谢. (2认同)