python unittest 模拟嵌套函数
python unittest mock a nested function
我在 main.applications.handlers
包
中有一个函数 x
from main.config import get_db
def x(company_name):
db = get_db('my_db')
apps = []
for x in company_db.applications.find():
print(x)
apps.append(x)
return apps
现在我想为此方法编写单元测试。
from unittest.mock import Mock,patch, MagicMock
@mock.patch('main.applications.handlers.get_db')
def test_show_applications_handler(self, mocked_db):
mocked_db.applications.find = MagicMock(return_value=[1,2,3])
apps = x('test_company') # apps should have [1,2,3] but its []
print(apps)
但是 main.applications.handlers
里面的 company_db.applications.find()
没有 returning 任何东西。它应该 return [1,2,3]
此代码可能有什么问题?
假设 company_db
是一个拼写错误,应该是 db
,那么要模拟 find()
的 return 值,您可以这样做:
mocked_db.return_value.applications.find = MagicMock(return_value=[1,2,3])
mocked_db
需要 return_value
因为 get_db
是用数据库名称调用的。
您也可以删除 MagicMock
并直接设置 find
的 return_value
:
mocked_db.return_value.applications.find.return_value = [1, 2, 3]
我在 main.applications.handlers
包
x
from main.config import get_db
def x(company_name):
db = get_db('my_db')
apps = []
for x in company_db.applications.find():
print(x)
apps.append(x)
return apps
现在我想为此方法编写单元测试。
from unittest.mock import Mock,patch, MagicMock
@mock.patch('main.applications.handlers.get_db')
def test_show_applications_handler(self, mocked_db):
mocked_db.applications.find = MagicMock(return_value=[1,2,3])
apps = x('test_company') # apps should have [1,2,3] but its []
print(apps)
但是 main.applications.handlers
里面的 company_db.applications.find()
没有 returning 任何东西。它应该 return [1,2,3]
此代码可能有什么问题?
假设 company_db
是一个拼写错误,应该是 db
,那么要模拟 find()
的 return 值,您可以这样做:
mocked_db.return_value.applications.find = MagicMock(return_value=[1,2,3])
mocked_db
需要 return_value
因为 get_db
是用数据库名称调用的。
您也可以删除 MagicMock
并直接设置 find
的 return_value
:
mocked_db.return_value.applications.find.return_value = [1, 2, 3]