我正在使用nosetests for Python代码来测试使用MongoDB连接的代码,我使用了mongoMock的python模拟标准库:https://github.com/vmalloc/mongomock,我修补了pymongo.MongoClient模块来模拟它,但是问题是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()
当我运行测试时,代码仍然插入真实数据库,代码打印实际连接!! 请问,它有什么问题以及如何正确地做到这一点?
提前致谢!
答案 0 :(得分:2)
我解决了这个问题,对我来说这很棘手,因为实际的代码和测试代码没有任何问题,只是模拟对象没有被实际调用,因为当我做了@ mock.patch我被提到这个模
@mock.patch'pymongo.MongoClient'
这就是为什么我应该通过编写
connection = pymongo.MongoClient('mongodb://localhost:27017/').customers.review
而不是写
connection = MongoClient('mongodb://localhost:27017/').customers.review