我想像这样模拟单元测试的方法:
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是一个函数,而不是一个模拟
我错过了什么?
答案 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。