Python mock Patch os.environ y valor de retorno

Unidades de prueba conn () utilizando simulacros:

app.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 mysql.connector.error.Errors as err: return "Error 

test.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") 

Error: mock_mysql.connect.assert_called_with se llama a la afirmación mock_mysql.connect.assert_called_with .

lo cual creo que es porque ‘Database_url’ no está en mi sistema operativo os.environ y debido a esa llamada de prueba no se hace a mysql_mock.connect.

Preguntas:

1 ¿Qué cambios debo hacer para que este código de prueba funcione?

2.¿También tengo que parchear ‘urlparse’?

 import mysql.connector import os,urlparse @mock.patch.dict(os.environ,{'DATABASE_URL':'mytemp'}) 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 mysql.connector.error.Errors as err: return "Error 

Puede intentar de esta manera. Simplemente llame a conn con un argumento dummy .

O

Si no desea modificar su función original, intente esto:

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

Para esto, me parece que el accesorio monkeypatch de pytest conduce a un mejor código cuando necesitas establecer variables de entorno:

 def test_conn(monkeypatch): monkeypatch.setenv('DATABASE_URL', '') with patch(app.mysql.connector) as mock_mysql: conn() mock_mysql.connect.assert_callled_with() 

También puede usar algo así como el administrador de contexto modified_environ descrito en esta pregunta para establecer / restaurar las variables de entorno.

 with modified_environ(DATABASE_URL='mytemp'): func()