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

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

最佳答案

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

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

关于python - 模拟 - 如何在调用者上引发异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10309132/

相关文章:

javascript - 开 Jest : how to count call from mock methods called via `call` or `apply` ?

python - 使用 seaborn/matplotlib boxplot 时的刻度频率

python - 使用 Graphene 和 SQLAlchemy 通过 GraphQL API 更新记录

unit-testing - 在 Jest 中没有调用 Mock

Laravel:如何模拟一个类

javascript - ECMAScript 5 支持测试套件

python - 396:错误:(-5)尚未计算此 LBPH 模型。你调用了train方法吗?在函数 cv::face::LBPH::predict 中

python - 使用管道运行外部程序并在 python 中传递参数

java - 模拟使用 Roo 生成的持久层

ruby - 在 RSpec Controller 规范中重构模拟