为Python单元测试模拟MongoDB

4
我正在使用nosetests来测试连接MongoDB的Python代码,我已经使用了python mock标准库和mongoMock: https://github.com/vmalloc/mongomock , 我已经修补了pymongo.MongoClient模块以进行mock,但问题是mongoMock对象没有替换实际对象,这意味着测试函数仍在使用实际的mongoDB连接。
以下是实际代码:
def post_data():

    connection = MongoClient('mongodb://localhost:27017/').customers.review
    post = {"author": "Mike",
    "text": "My first blog post!",
    "tags": ["mongodb", "python", "pymongo"],
    "votes":1}
    print connection

    connection.insert_one(post)

测试功能:
@mock.patch('pymongo.MongoClient')

def test_post_data(mock_MongoClient):

    mock_MongoClient.return_value= mongomock.MongoClient().db.collection

    post_data()

当我运行测试时,代码仍然在真实数据库中插入数据,并且代码打印出了实际的连接!请问这是什么问题,如何正确处理?
提前感谢!
1个回答

6

我解决了这个问题,对我来说很棘手,因为实际代码和测试代码都没有任何问题,只有模拟对象没有被实际调用,因为当我使用 @mock.patch 时,我提到了这个模块 @mock.patch'pymongo.MongoClient' ,这就是为什么我应该通过编写来创建我的连接。

connection = pymongo.MongoClient('mongodb://localhost:27017/').customers.review

改为编写

connection = MongoClient('mongodb://localhost:27017/').customers.review

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接