Python模拟补丁os.environ并返回值 [英] Python mock Patch os.environ and return value

查看:183
本文介绍了Python模拟补丁os.environ并返回值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用模拟单元测试conn():

Unit testing conn() using 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进行该测试调用.

which i believe it is because 'Database_url' is not in my patched os.environ and because of that test call is not made to mysql_mock.connect.

问题:

1为了使此测试代码有效,我需要进行哪些更改?

1 what changes i need to make to make this test code work?

2.我还必须修补"urlparse"吗?

2.Do i also have to patch '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

您可以尝试这种方式.只需使用dummy参数调用conn.

You can try this way.Just call conn with a dummy argument.

如果您不想修改您的原始功能,请尝试以下操作:

If you dont want to modify ur original function try this:

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

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

test_func()

这篇关于Python模拟补丁os.environ并返回值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆