首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从另一个函数调用mongodb时,如何模拟它?

当从另一个函数调用mongodb时,如何模拟它?
EN

Stack Overflow用户
提问于 2018-12-17 13:27:37
回答 2查看 4K关注 0票数 3

我在嘲笑mongodb的时候需要帮助。我使用蒙哥莫克来模拟mongodb。

我的项目结构是:

-- my_mongo.py -- code.py -- my_test.py

my_mongo.py有:

代码语言:javascript
复制
from pymongo import MongoClient

 def get_db():
   client = MongoClient(os.environ['MONGODB_URI'])
   db = client['my_db']
   return db

 def insert(id, data):
     return get_db().results.insert_one(
          {
          "id": id,
          "data":df.to_json(),
          }).id

code.py

代码语言:javascript
复制
import my_mongo

def action():
    #do somethings
    my_mongo.insert(id, data)

my_test.py

代码语言:javascript
复制
import mongomock
import my_mongo
from unittest import mock


with patch.object(my_mongo.get_db().client, "client",  mongomock.MongoClient()):
    import code

def test_action_1():
    my_mongo.insert = mock.Mock(return_value=1)
    code.action()   

def test_action_2():
     with patch.object(my_mongo.get_db(), "get_db", mongomock.MongoClient().db):
     code.action()

它为两个测试抛出pymongo.errors.ServerSelectionTimeoutError。因此,它仍然进入my_mongo.py中的my_mongo.py()方法。我希望在test_action_1 my_mongo.insert中返回1,但它不返回。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

发布于 2018-12-20 12:54:38

我不完全确定mongomock是用来做什么的,但看起来它是用来模拟整个mongo数据库的,而不是实际使用python模拟的。我将不包括mongomock,因为我不认为你真的需要它,所以你可以接受它的价值。

有几个问题:

  1. 调用patch.object将修补给定对象上的给定方法。如果在测试中调用get_db,那么code.action调用get_db,这是两个不同的对象。也许这个有用?但我很怀疑,所以我就改变了。
  2. 不要使用code作为模块名。这已经是python包含的一个模块了。
  3. code.action丢失了args和返回语句。

您还会注意到,我更改了被嘲弄的方式和内容,以说明实现嘲讽的不同方法。测试1用函数修饰器模拟insert调用。测试2用一个get_db模拟contextmanager调用。两者都是正确的,只是表明你有选择。

这是成品:

my_mongo.py:

代码语言:javascript
复制
from pymongo import MongoClient

def get_db():
    client = MongoClient(os.environ['MONGODB_URI'])
    db = client['my_db']
    return db

def insert(id, data):
    return get_db().results.insert_one({"id": id, "data":data.to_json()}).id  # df was undefined, updated to data

my_code.py:

代码语言:javascript
复制
import my_mongo

# I added id and data args. They were undefined
def action(id, data):
    return my_mongo.insert(id, data)  # I added a return here

my_test.py

代码语言:javascript
复制
from unittest import mock

import my_code

# I removed the contextmanager import. Nothing is being evaluated here that would
# need to be patched, so I'm pretty certain it has no effect

@mock.patch('my_mongo.insert')
def test_action_1(mock_insert):
    expected_id = 1
    mock_insert.return_value = expected_id
    ret = my_code.action(expected_id, mock.Mock())
    assert ret == expected_id

def test_action_2():
    with mock.patch('my_mongo.get_db') as mock_get_db:
        expected_id = 'some id'
        mock_db = mock.Mock()
        mock_db.results.insert_one.return_value.id = expected_id
        mock_get_db.return_value = mock_db
        ret = my_code.action(expected_id, mock.Mock())
    assert ret == expected_id
票数 1
EN

Stack Overflow用户

发布于 2020-10-14 10:27:14

修复mongodb的代码行是错误的。与其使用patch.object(my_mongo.get_db(), "get_db", mongomock.MongoClient().db),不如使用patch.object("my_mongo.get_db", return_value=mongomock.MongoClient()['my_db'])

下面是示例的完整可运行代码:

my_test.py

代码语言:javascript
复制
import mongomock
from unittest.mock import patch

import my_code
import my_mongo


def test_action_2():
    mocked_mongo = mongomock.MongoClient()
    with patch("my_mongo.get_db", return_value=mongomock.MongoClient()['my_db']):
        my_code.action()
        assert mocked_mongo.my_db.results.count_documents({'id': 'some_id'}) == 1

my_mongo.py

代码语言:javascript
复制
from pymongo import MongoClient

def get_db():
    client = MongoClient(os.environ['MONGODB_URI'])
    db = client['my_db']
    return db

def insert(id, data):
    return get_db().results.insert_one(
        {
            "id": id,
            "data": data,
        })

my_code.py

代码语言:javascript
复制
import my_mongo

def action():
    #do somethings
    return my_mongo.insert('some_id', '{"a": 3}')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53816215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档