使用mock进行单元测试conn():
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:
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")
错误:Assertionmock_mysql.connect.assert_called_with
未被调用。
我相信这是因为'Database_url'不在我的补丁os.environ
中,并且因为测试调用没有对mysql_mock. connect进行。
问题:
1.我需要做哪些更改才能使此测试代码正常工作?
1.我是否还必须修补urlparse
?
7条答案
按热度按时间bihw5rsg1#
你可以尝试unittest.mock.patch.dict解决方案,只需要用
dummy
参数调用conn
即可:或者如果你不想修改你的原始函数,试试这个解决方案:
hpcdzsge2#
为此,我发现当你需要设置环境变量时,pytest's monkeypatch fixture会带来更好的代码:
juzqafwq3#
接受的答案是正确的。这里有一个装饰器
@mockenv
来做同样的事情。bvpmtnay4#
在我的用例中,我试图模拟没有设置环境变量。要做到这一点,请确保将
clear=True
添加到补丁中。bihw5rsg5#
在导入模块之前,在文件模拟环境的头部:
fhity93d6#
您还可以使用类似question中描述的
modified_environ
上下文管理器来设置/恢复环境变量。vpfxa7rd7#
对here的回答略有改进