Python mock Patch os.environ和return valu

2024-04-26 05:34:17 发布

您现在位置:Python中文网/ 问答频道 /正文

使用mock对conn()进行单元测试:

应用程序.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

测试.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”吗?


Tags: pyimporturlconnectorosdefasconnect
3条回答

您还可以使用本question中描述的modified_environ上下文管理器来设置/还原环境变量。

with modified_environ(DATABASE_URL='mytemp'):
    func()
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

你可以这样做。只要用dummy参数调用conn

或者

如果不想修改原始函数,请尝试以下操作:

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

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

test_func()

为此,我发现当需要设置环境变量时,pytest's monkeypatch fixture会产生更好的代码:

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

相关问题 更多 >