python在另一个方法中调用的方法的模拟返回值不起作用

时间:2016-12-14 14:45:06

标签: python unit-testing mocking

我想像这样模拟单元测试的方法:

get_tree_test.py

from company.marketing_tree import get_tree

class MidNightTests(TestCase):
 @mock.patch("company.analytics.get_fb_data", autospec=True)
    def test_first_midnight(self, mock_fb_data):
        mock_fb_data.return_value = {}
        get_tree()

get_tree.py

from company.analytics import get_fb_data

def get_tree():
    executor = ThreadPoolExecutor(max_workers=2)
    data_caller = executor.submit(get_data)
    info_caller = executor.submit(get_info)

def get_data():
    executor = ThreadPoolExecutor(max_workers=2)
    first_data = exeuctor.submit(get_fb_data)

我确实看到mock_fb_data.return_value = {}被创建为模拟对象,但是当我调试get_data()方法时,我看到get_fb_data是一个函数,而不是一个模拟

我错过了什么?

1 个答案:

答案 0 :(得分:2)

你需要修补正确的地方。在get_tree内,您创建了一个全局名称get_fb_data,代码直接使用该名称:

from company.analytics import get_fb_data

您需要修补该名称,而不是原始company.analytics.get_fb_data名称;修补工作通过替换名称来指向模拟而不是:

class MidNightTests(TestCase):
    @mock.patch("get_tree.get_fb_data", autospec=True)
    def test_first_midnight(self, mock_fb_data):
        mock_fb_data.return_value = {}
        get_tree()

请参阅unittest.mock文档的Where to patch section