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

2024-04-01

我在嘲笑 mongodb 时需要帮助。我在用蒙戈莫克 https://github.com/mongomock/mongomock模拟 mongodb。

我的项目结构是:

-- my_mongo.py
-- 代码.py
-- my_test.py

my_mongo.py有 :

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

and code.py has

import my_mongo

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

and my_test.py has

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 中的 insert_one() 方法。 我期望在 test_action_1 my_mongo.insert 中返回 1,但事实并非如此。

我缺少什么?


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

有几个问题:

  1. Calling patch.object将在您提供的任何对象上修补给定的方法。如果你打电话get_db在测试中,那么code.action calls get_db,这是两个不同的对象。也许这有效?但我对此表示怀疑,所以我只是改变了它。

  2. 不要使用code作为你的模块名称。这已经是 python 中包含的一个模块了。

  3. code.action缺少参数和返回语句。

您还会注意到,我更改了模拟的方式和内容,以说明完成模拟的不同方法。测试 1 模拟insert使用函数装饰器调用。测试 2 模拟get_db打电话给contextmanager。两者都是正确的,只是表明您有选择。

这是成品:


my_mongo.py:

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

我的代码.py:

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

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当从另一个函数调用 mongodb 时如何模拟 mongodb? 的相关文章

随机推荐

  • 让SVM在Python中运行得更快

    使用code下面是 python 中的 svm from sklearn import datasets from sklearn multiclass import OneVsRestClassifier from sklearn svm
  • 使用 NumPy/SciPy 进行向量值函数插值

    有没有办法使用向量值函数进行插值NumPy http en wikipedia org wiki NumPy SciPy http en wikipedia org wiki SciPy 有很多适用于标量值函数的产品 我想我可以使用其中之一
  • Retrofit 将对象数组转换为 GSON 错误

    我正在使用 Retrofit 发出 HTTP 请求 该请求返回一个对象数组 但出现以下错误 com google gson JsonSyntaxException java lang IllegalStateException Expect
  • 播放wav文件c#代码

    如何在另一台电脑上播放 wav 文件 我知道我必须将 wav 文件作为输出设备上的缓冲区发送 有人可以用 C 给出一个简短的 eq 吗 您需要使用 Flash 或 Silverlight 在浏览器中播放音频 您不需要重新发明轮子 此外 除了
  • Linux 上使用 C/C++ 编写的简单原始套接字服务器

    我正在尝试使用原始套接字构建以太网 我无法使用 TCP IP UDP 或任何其他协议 这是因为它将与非常简单的硬件进行通信 这些硬件没有资源来处理所有不同的协议层 我的网络将由一台主机组成 通过以太网交换机与多个硬件进行通信 此时 我基本上
  • 通过 google 模块进行 Python 搜索给出 SSL: CERTIFICATE_VERIFY_FAILED 错误

    我在 Mac OSX 上使用 Python 3 python3 版本给出 Python 3 6 3 我安装了certifi已经包了 python 3 m pip install certifi回馈 Requirement already s
  • 在 NetBeans 快捷方式中注释/取消注释代码块

    NetBeans 中是否有快捷方式可以突出显示代码块并对其进行注释 取消注释 Try this combination in the Netbeans Editor ctrl shift c
  • cookie 值应该进行 URL 编码吗?

    设置 cookie 时 PHP 对 cookie 值进行 url 编码 至少在不使用时 setrawcookie 它对 cookie 值进行 url 解码在将其提供给应用程序之前 COOKIE 这是公认的标准吗 如果我将原始 cookie
  • 如何根据多个字段删除SQL表中的重复项

    我有一张游戏桌 描述如下 Field Type Null Key Default Extra id int 11 NO PRI NULL auto increment date date NO NULL
  • Rails ActionMailer 忽略environment.rb 中的设置

    我把我的 ActionMailer 配置放在我的config environment rb像这样的文件 MyApp Application initialize MyApp Application configure do config a
  • 黄瓜无法加载 2.1/gherkin_lexer_en

    每当我运行黄瓜功能时 我都会收到以下错误 但是 该脚本工作正常 但每次执行功能文件时都会出现此警告消息 这里有什么问题吗 C Automation PickLists Activities 2 RemoveActivity gt cucum
  • 函数中的变量

    我看到了下面的代码 第一次调用 next num 回报1 第二个返回2 define next num let num 0 lambda set num num 1 num next num 1 next num 2 我无法理解的是 num
  • JavaFX 中的字段验证[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我使用 fxml 创建了一份注册表单 现在我想实现字段验证功能 我正在尝试实现 TextField 的验证 但仍然没有得到它 不幸的是
  • CSS(位置:绝对+左:50%=最大宽度:50%)?

    我正在开发一个网站 但遇到了临时问题 我有一个div with CSS像这样 box position absolute width auto max width 75 left 50 transform translate 50 0 ms
  • Rails:如何添加目标空白的 link_to

    我是 Rails 3 的新手 我想将 target gt blank 添加到下面的 link to helper link to GOOGLE http www google com class btn btn large btn prim
  • 每次都会出现权限屏幕

    我想让我的 WinForms 应用程序使用 Microsoft 帐户的单点登录 SSO 功能 我创建了一个LiveApp https account live com developers applications我可以使用 LiveSDK
  • 我们如何在 Java 中进行异步 REST api 调用?

    我正在使用 Spring RestTemplate 并且想要调用另一个不返回任何响应正文的服务 所以 我不想等待回复 因此 只需即发即忘 然后继续剩余的代码 我正在考虑创建一个新线程来执行此操作 但不确定什么是正确的方法 如果您使用Java
  • 拉普拉斯滤波器是如何计算的?

    我不太明白他们是如何得出导数方程的 有人可以详细解释一下 甚至可以提供一个有足够数学解释的链接吗 拉普拉斯滤波器看起来像 拉普拉斯先生提出了这个方程 这就是拉普拉斯算子的简单定义 二阶导数之和 您也可以将其视为海森矩阵 https en w
  • VS 2015 Azure 发布向导不处理 ARM 创建的资源吗?

    我可以从发布向导中看到 ARM 云服务 但在使用管理员帐户时看不到 ARM 存储 我可以使用管理员帐户发布到 ARM 云服务 但必须指定 ASM 存储帐户 当使用 RBAC 访问权限仅限于包含上述云服务的资源组的帐户时 发布向导会提示云服务
  • 当从另一个函数调用 mongodb 时如何模拟 mongodb?

    我在嘲笑 mongodb 时需要帮助 我在用蒙戈莫克 https github com mongomock mongomock模拟 mongodb 我的项目结构是 my mongo py 代码 py my test py my mongo