使用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相关问答推荐

Python:字典和列表:在列表字典中搜索子列表的有效方法

如何从枚举中获取某个值?

将列表转换为 pandas 数据框,其中列表包含字典

我可以设置树视图层次 struct 按钮吗?

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

Pandas教程:如何更新行内数值的位置

找到在指定列的另一个分组中存在重复的行.

它们是否同样存储在python3的内存中?

过滤列表中的所有字典以使用特定键并忽略其他键?

过滤并获取数据框中条件之间的行

使用正则表达式提取字符串之间的文本

如何在 on_ready 事件中使用 change_presence? (discord.py)

如何使用 Selenium by class_name 从大学橄榄球数据中抓取图像 url 列表

Pythonic,自定义警告

如何在 Python 中计算 cohen 的 d?

发送Electron邮件时的 MIMEText UTF-8 编码问题

django - 值更改后自动更新日期

Python中的多行日志(log)记录

如何在 python 3.x 中禁用 ssl 判断?

python中的订单字典索引