模拟变量的功能

时间:2014-09-03 16:21:44

标签: python unit-testing mocking

对于单元测试,我想在函数内部模拟变量,例如:

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的地方吗?

2 个答案:

答案 0 :(得分:8)

只需使用@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()是否通过了正确的对象。

答案 1 :(得分:4)

假设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 有一百万种使用模拟的方法 - 阅读文档以确定可以设置返回值的所有方法等等。