Python mock Patch os.environ 和返回值

新手上路,请多包涵

使用 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")

错误:未调用 断言 mock_mysql.connect.assert_called_with

我认为这是因为“Database_url”不在我的补丁中 os.environ 并且因为没有对 mysql_mock.connect 进行测试调用。

问题:

  1. 我需要做哪些更改才能使此测试代码正常工作?

  2. 我还必须打补丁 urlparse 吗?

原文由 immrsteel 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 778
2 个回答

您可以尝试 unittest.mock.patch.dict 解决方案。只需使用 dummy 参数调用 conn 即可:

 import mysql.connector
import os, urlparse
from unittest import mock

@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"

或者,如果您不想修改原始功能,请尝试以下解决方案:

 import os
from unittest import mock

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

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

test_func()

原文由 vks 发布,翻译遵循 CC BY-SA 4.0 许可协议

为此,我发现当您需要设置环境变量时, pytest 的 monkeypatch fixture 会产生更好的代码:

 def test_conn(monkeypatch):
    monkeypatch.setenv('DATABASE_URL', '<URL WITH CREDENTIAL PARAMETERS>')
    with patch(app.mysql.connector) as mock_mysql:
        conn()
    mock_mysql.connect.assert_called_with(<CREDENTIAL PARAMETERS>)

原文由 Toote 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题