如何在 Python 中模拟从 MongoClient() 返回的数据

How to mock data returned from MongoClient() in Python

我正在尝试编写测试用例,我想模拟从 MongoClient() 返回的数据对象,下面是代码。

numbers.py

def get_count():

    client_int = MongoClient('abc.xyz.com', port=27010)

    return client_int

test_numbers.py

@patch('pymongo.MongoClient')

def test_get_count(mocked_object):

    mocked_object.return_value = [{'1': 'data'}]

    assert numbers.get_count() == [{'1': 'data'}] # Here i am getting Assertion Error, MongoClient!=[{'1': 'data'}]

如何实现这个功能??出了什么问题??

首先,您应该重命名您的模块。不能使用numbers,因为它与python内置库numbers.

冲突

你没有正确修补目标。您应该修补 my_numbers.py 模块的 MongoClient。有关详细信息,请参阅 where-to-patch

例如

my_numbers.py:

from pymongo import MongoClient


def get_count():

    client_int = MongoClient('abc.xyz.com', port=27010)

    return client_int

test_my_numbers.py:

import unittest
from unittest.mock import patch
import my_numbers


class TestNumbers(unittest.TestCase):
    @patch('my_numbers.MongoClient')
    def test_get_count(self, mocked_object):
        mocked_object.return_value = [{'1': 'data'}]
        assert my_numbers.get_count() == [{'1': 'data'}]
        mocked_object.called_once_with_value('abc.xyz.com', port=27010)


if __name__ == '__main__':
    unittest.main()

单元测试结果:

 ⚡  coverage run /Users/dulin/workspace/github.com/mrdulin/python-codelab/src/Whosebug/66852436/test_my_numbers.py && coverage report -m --include='./src/**'
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
Name                                            Stmts   Miss  Cover   Missing
-----------------------------------------------------------------------------
src/Whosebug/66852436/my_numbers.py            4      0   100%
src/Whosebug/66852436/test_my_numbers.py      11      0   100%
-----------------------------------------------------------------------------
TOTAL                                              15      0   100%