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 并直接设置 findreturn_value:

mocked_db.return_value.applications.find.return_value = [1, 2, 3]