【问题标题】:Mock variable in function函数中的模拟变量
【发布时间】:2014-09-03 16:21:43
【问题描述】:

对于单元测试,我想mock一个函数内部的变量,比如:

def function_to_test(self):
    foo = get_complex_data_structure()  # Do not test this
    do_work(foo)  # Test this

我的单元测试,我不想依赖get_complex_data_structure() 会返回什么,因此想手动设置 foo 的值。

我该如何做到这一点?这是@patch.object的地方吗?

【问题讨论】:

    标签: python unit-testing mocking


    【解决方案1】:

    只需使用@patch() 模拟出get_complex_data_structure()

    @patch('module_under_test.get_complex_data_structure')
    def test_function_to_test(self, mocked_function):
        foo_mock = mocked_function.return_value
    

    当测试函数调用get_complex_data_structure()时,一个模拟对象被返回并存储在本地名称foo中;与上述测试中mocked_function.return_value 引用的对象完全相同;例如,您可以使用该值来测试 do_work() 是否通过了正确的对象。

    【讨论】:

    • 当 get_complex_data_structure() 有一些参数并被调用两次返回两个不同的值 foo1 和 foo2 时,我们如何模拟?上面给出的解决方案将为 foo1 和 foo2 生成相同的模拟值
    • @chintan-p-bhatt: 然后将Mock.side_effect 设置为一个可迭代对象(Python 将为每次调用使用该可迭代对象的下一个值)或一个函数;一个函数被赋予相同的参数,因此您可以根据这些参数返回一个值。
    • @chintan-p-bhatt:不能在 cmets 或代码块中使用多行;只有` 单个反引号有效。你不需要告诉我你是如何让它工作的,这里有other answers I gave on mocking that use .side_effect,你可以参考。如果你有一个新问题,你可以创建一个新的帖子。
    【解决方案2】:

    假设 get_complex_data_structure 是一个函数1,您可以使用各种mock.patch utilities 中的任何一个来修补它:

    with mock.patch.object(the_module, 'get_complex_data_structure', return_value=something)
      val = function_to_test()
      ...
    

    它们可以用作装饰器或上下文管理器,或者使用startstop 方法显式启动和停止。2


    1如果它不是一个函数,你总是可以将该代码分解为一个返回复杂数据结构的简单实用函数
    2一百万种使用模拟的方法——阅读文档以找出可以设置返回值等的所有方法是值得的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2021-12-08
      • 2020-11-17
      • 2023-02-03
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      相关资源
      最近更新 更多