【问题标题】:How do I test that a global variable is updated as part of a unit test in Python?如何测试全局变量是否作为 Python 中单元测试的一部分进行了更新?
【发布时间】:2021-05-21 16:54:00
【问题描述】:

Related post on Mocking global variables

outgoing.py
table_data = []
def outgoing_data():
    record = *do some stuff*
    table_data.append(record)

在单元测试中,我想验证table_data 是否已更新。我尝试按照相关帖子中所示进行设置,但这似乎更旨在通过在补丁中设置其值来在函数内部使用该全局变量。我已经成功地用数据修补了全局变量,以便在其他方法中使用:@patch('outgoing.outgoing_data.table_data', [{'action_hist_id': 1, 'page_num': 1, 'row_num': 1}]) 作为装饰器。

我尝试了@patch('outgoing.outgoing_data.table_data', []),但没有按预期工作。我预计补丁会生成一个模拟,它可能是,但我无法在调试窗口中看到它以了解它是否被调用等。

如果问题不清楚或需要更多信息,请告诉我。提前致谢。

【问题讨论】:

  • 我的建议:不要有全局变量。明确地将它传递给你的函数并从你的函数中返回它
  • outgoing.table_data 是要修补的名称。函数outgoing.outgoing_data 没有函数属性,因此创建一个函数不会使用的函数不会完成任何事情。
  • @PaulH 我试图避免重构代码,但这可能是要走的路。 @chepner 我可能输入了错误的示例代码。我的意图是打电话给outgoing_data,然后测试它是否更新了table_data
  • 为了完整起见,我发布了我的问题的解决方案,但最后我按照@PaulH 的建议进行了重构

标签: python python-3.x python-unittest


【解决方案1】:
@patch('outgoing.table_data')
def my_test(mock_table_data):
    outgoing_data()
    self.assertEqual(expected_result, mock_table_data.method_calls[0][1])

这是在测试类中运行的,因此使用了selfmethod_calls[0] 是对模拟对象的第一次调用。 method_calls[0][0] 返回调用的名称,在这种情况下appendmethod_calls[0][1] 返回传递的数据。

Python docs on Mock.method_calls

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多