【问题标题】:Mocking - How do I raise exception on the caller?模拟 - 如何在调用者上引发异常?
【发布时间】:2012-05-05 18:03:01
【问题描述】:

假设这是代码

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

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

    您的示例中有错字,缺少'

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

    【讨论】:

    • 非常感谢。我为混乱道歉。这是一个我没有发现的复制粘贴错误。是的,我正在修补 move 而不是 rmtree。我相应地编辑了帖子。您对我的粗心大意是正确的。非常感谢。
    猜你喜欢
    • 2012-05-29
    • 2023-03-27
    • 1970-01-01
    • 2020-07-08
    • 1970-01-01
    • 2015-03-08
    • 2013-01-24
    • 2017-04-05
    • 2018-11-26
    相关资源
    最近更新 更多