@patch模拟到mysqldb的连接不起作用



我正在为使用 MySQLdb 连接到 Mysql 的 Python 应用程序编写单元测试。 有一个函数连接到 Mysql db 并返回连接对象。

def connect_to_database():
conn = MySQLdb.connect(host=db_pb2['mysql_host'],
user=db_pb2['mysql_user'],
passwd=db_pb2['mysql_password'],
db=db_pb2['mysql_db'])
return conn

还有一个函数使用上述连接执行查询

def execute_query():
cur = connect_to_database().cursor()
a = cur.execute("query")
if a > 0:
result = cur.fetchall()
return result

我已经编写了@patch来模拟cur.fetchall((和cur.execute((方法的返回值

@patch('application.module1.data_adapters.connect_to_database')
def test_daily_test_failures(self, db_connection):
db_connection.cursor().execute.return_value = 1
db_connection.cursor().fetchall. 
return_value = ((1,5,6),)
self.assertEqual((execute_query(),
((1,5,6),))

我收到以下错误:

if a > 0:
TypeError: '<=' not supported between instances of 'MagicMock' and 'int'

似乎补丁函数中的返回值没有按预期工作

您的修补需要更多的努力。

@patch('application.module1.data_adapters.connect_to_database')
def test_daily_test_failures(self, connect_to_database):
db_connection = MagicMock()
connect_to_database.return_value = db_connection  # 1.
mock_cursor = MagicMock()
db_connection.cursor.return_value = mock_cursor   # 2.
mock_cursor.fetchall.return_value = ((1,5,6),)
self.assertEqual((execute_query(),
((1,5,6),))
  1. 您正在修补符号connect_to_database- 这不会模拟对函数的调用。您需要指定"调用该符号时,执行此操作">
  2. 模拟函数调用时,你不能这样做:db_connection.cursor().- 你需要让db_connection.cursor返回一个模拟,然后指定该模拟对象的.return_value

最新更新