Python mock Patch os.environ and return value Python mock Patch os.environ and return value python python

Python mock Patch os.environ and return value


You can try unittest.mock.path_dict solution. Just call conn with a dummy argument:

import mysql.connectorimport os, urlparse@mock.patch.dict(os.environ, {"DATABASE_URL": "mytemp"}, clear=True)  # why need clear=True explained here https://stackoverflow.com/a/67477901/248616def 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"

Or if you don't want to modify your original function try this solution:

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


For this, I find that pytest's monkeypatch fixture leads to better code when you need to set environment variables:

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>)


The accepted answer is correct. Here's a decorator @mockenv to do the same.

def mockenv(**envvars):    return mock.patch.dict(os.environ, envvars)@mockenv(DATABASE_URL="foo", EMAIL="bar@gmail.com")def test_something():    assert os.getenv("DATABASE_URL") == "foo"