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"