使用mock对conn()进行单元测试:

应用程序.py

import mysql.connector
import os, urlparse


def conn():
    if "DATABASE_URL" in os.environ:
        url = urlparse(os.environ["DATABASE_URL"])
        g.db = mysql.connector.connect(
            user=url.username,
            password=url.password,
            host=url.hostname,
            database=url.path[1:],
        )
    else:
        return "Error"

测验py

def test_conn(self):
    with patch(app.mysql.connector) as mock_mysql:
        with patch(app.os.environ) as mock_environ:
            con()
            mock_mysql.connect.assert_callled_with("credentials")

错误:未调用Assertion mock_mysql.connect.assert_called_with.

我相信这是因为"Database_url"不在我的补丁操作系统中.由于该测试调用没有被调用到mysql_mock.连接

问题:

1为了使测试代码正常工作,我需要做哪些更改?

2.我是否也必须修补"urlparse"?

推荐答案

你可以试试unittest.mock.patch.dict种解决方案.用dummy参数拨打conn即可:

import mysql.connector
import os, urlparse


@mock.patch.dict(os.environ, {"DATABASE_URL": "mytemp"}, clear=True)  # why need clear=True explained here https://stackoverflow.com/a/67477901/248616
def conn(mock_A):
    print os.environ["mytemp"]
    if "DATABASE_URL" in os.environ:
        url = urlparse(os.environ["DATABASE_URL"])
        g.db = mysql.connector.connect(
            user=url.username,
            password=url.password,
            host=url.hostname,
            database=url.path[1:],
        )
    else:
        return "Error"

或者,如果不想修改原始函数,请try 以下解决方案:

def func():
    print os.environ["mytemp"]


def test_func():
    k = mock.patch.dict(os.environ, {"mytemp": "mytemp"})
    k.start()
    func()
    k.stop()


test_func()

Python-3.x相关问答推荐

Gekko优化超出了方程式的界限(由于某种原因,会产生变量)

如何在python中有效地使用多处理和pytube库来加快下载速度?

Python多处理池:缺少一个进程

按小时和日期对Pandas 数据帧进行分组

PythonPandas READ_EXCEL空数据帧

将自定义函数应用于 pandas 数据框的每一列

如何获取实例化 `types.GenericAlias` 的下标类?

Pandas 转换为日期时间

如何统计一个值连续出现的次数?

Keras 中 Conv2D 层的意外结果

numpy是如何添加@运算符的?

使用 OpenCV 从图像中减go 一条线

Python:获取未绑定的类方法

如何为 Python 中的线程设置异步事件循环?

python total_ordering:为什么使用 __lt__ 和 __eq__ 而不是 __le__?

IronPython 3 支持?

如何使用python将放置在多个嵌套文件夹中的文档移动和重命名为一个新的单个文件夹?

作为函数对象属性的 __kwdefaults__ 有什么用?

BeautifulSoup 的 Python 3 兼容性

Python configparser 不会接受没有值的键