对于单元测试,我想在函数内部模拟变量,例如:
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
的地方吗?
答案 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()
...
它们可以用作装饰器或上下文管理器,也可以使用start
和stop
方法显式启动和停止。 2
1 如果它不是一个函数,你总是可以将该代码分解为一个简单的实用函数,它返回复杂的数据结构
2 有一百万种使用模拟的方法 - 阅读文档以确定可以设置返回值的所有方法等等。