Python mock Patch os.environ и возвращаемое значение

Unit testing conn() с использованием 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")

Ошибка: утверждение mock_mysql.connect.assert_called_with не вызывается.

который я считаю, потому что "Database_url" не находится в моем исправленном os.environ, и из-за этого тестовый вызов не выполняется в mysql_mock.connect.

Вопросы:

1 Какие изменения мне нужно сделать, чтобы этот тестовый код работал?

2. Мне также нужно исправить "urlparse"?

Ответ 1

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

Вы можете попробовать таким образом. Просто вызовите conn с аргументом dummy.

или

Если вы не хотите изменять оригинальную функцию ur, попробуйте следующее:

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

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

test_func()

Ответ 2

Вы также можете использовать что-то вроде диспетчера контекста modified_environ в этом вопросе для установки/восстановления переменных среды.

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