猴子补丁cursor.execute()和关闭()或不?

时间:2015-07-17 07:49:06

标签: python unit-testing dependency-injection mocking monkeypatching

"尝试使用 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()

我是否需要修补猴子? 如果是,请提示如何修补它们? 如果不是,那么嘲笑它们的另一种方法是什么?

1 个答案:

答案 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")