"尝试使用 unittest.mock python库"对我的代码进行单元测试。 我有运行数据库查询的代码非常类似于此:
app.py:
from flask import g
import mysql.connector
@app.route('/')
def create_table():
g.db=mysql.connector.connect("credentials")
cursor = g.db.cursor()
cursor.execute('CREATE TABLE IF NOT EXISTS test(id INT NOT NULL PRIMARY KEY, name VARCHAR(40),email VARCHAR(40) NOT NULL)')
cursor.close()
g.db.close()
我使用以下方法嘲笑了我的g.db,但是从这里开始我正在努力模拟cursor.execute()
和cursor.close()
。任何帮助将不胜感激。
def testtable():
with patch('app.mysql.connector') as mock_mysql_connector:
create_table()
print g.db
#mock execute and close#
在打印g.db
时我得到 Mock 名称和ID,我相信这意味着g.db被嘲笑,但我不知道我应该如何模仿{{ 1}}和execute()
。
我是否需要修补猴子? 如果是,请提示如何修补它们? 如果不是,那么嘲笑它们的另一种方法是什么?
答案 0 :(得分:1)
您可以使用patch.multiple:
from mock import patch, DEFAULT
with patch.multiple('app', mysql=DEFAULT, g=DEFAULT) as dict:
# Mocking
connector = dict[̈́'mysql'].connector
db = connector.connect.return_value
cursor = db.cursor.return_value
# Run function to test
create_table()
# Assertions
assert dict['g'].db == db
db.close.assert_called_once_with()
cursor.close.assert_called_once_with()
connector.connect.assert_called_once_with("credentials")