web-dev-qa-db-fra.com

Python mock Patch os.environ et valeur de retour

Test unitaire conn () à l'aide de mock:

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

Erreur: Assertionmock_mysql.connect.assert_called_with n'est pas appelé.

ce que je pense que c'est parce que 'Database_url' n'est pas dans mon os.environ patché et à cause de cet appel de test n'est pas fait à mysql_mock.connect.

Des questions:

1 Quelles modifications dois-je apporter pour que ce code de test fonctionne?

2.Dois-je aussi patcher 'urlparse'?

29
immrsteel
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

Vous pouvez essayer de cette façon. Appelez simplement conn avec un argument dummy.

Ou

Si vous ne souhaitez pas modifier votre fonction d'origine, essayez ceci:

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

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

test_func()
51
vks

Pour cela, je trouve que montage monkeypatch de pytest conduit à un meilleur code lorsque vous devez définir des variables d'environnement:

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_callled_with(<CREDENTIAL PARAMETERS>)
10
Toote

Vous pouvez également utiliser quelque chose comme modified_environ le gestionnaire de contexte décrit dans cette question pour définir/restaurer les variables d'environnement.

with modified_environ(DATABASE_URL='mytemp'):
    func()
3
Laurent LAPORTE