如何模拟 cursor.execute
How to mock cursor.execute
我试图在不集成 mysql 数据库的情况下为以下代码编写测试。可能吗?
def sql_query_select(select, table, condition, variable):
cursor = database_connection("cursor")
sql_query = "SELECT " + select + " from " + table + " where " + condition + " = " + "'" + variable + "'"
cursor.execute(sql_query)
try:
response = cursor.fetchone()[0]
except:
response = cursor.fetchone()
cursor.close()
return response
我试过下面的代码作为测试
@mock.patch("lambda_function.database_connection")
@mock.patch("pymysql.cursors.Cursor.execute")
def test_sql_query_select(self, mock_database_connection, mock_execute):
mock_database_connection.return_value = "cursor"
mock_execute.return_value = "test"
self.assertEqual(lambda_function.sql_query_select("select", "table", "condition", "variable"), "execute")
但是出现以下错误,我不确定如何继续。
E AttributeError: 'str' object has no attribute 'execute'
您已经在尝试模拟 database_connection()
。您不需要也模拟 cursor.execute()
,因为您可以将您想要的行为注入 database_connection()
的 return 值。问题是您需要模拟对象 使用它们的地方 而不是定义它们的地方。看起来 sql_query_select()
在名为 lambda_function.py
的文件中,因此模拟看起来像这样:
@mock.patch(lambda_function.database_connection)
def test_sql_query_select(self, mock_database_connection):
mock_record = ('record one', 'record two')
mock_database_connection.return_value.fetchone.return_value = mock_record
result = lambda_function.sql_query_select("select", "table", "condition", "variable")
self.assert_equal(mock_record, result)
这种测试的一个问题是它完全忽略了 sql_query_select()
的参数。一种解决方案是验证是否调用了 database_connection.return_value.execute
。
这也不令人满意,因为您是在测试实现而不是行为。
我试图在不集成 mysql 数据库的情况下为以下代码编写测试。可能吗?
def sql_query_select(select, table, condition, variable):
cursor = database_connection("cursor")
sql_query = "SELECT " + select + " from " + table + " where " + condition + " = " + "'" + variable + "'"
cursor.execute(sql_query)
try:
response = cursor.fetchone()[0]
except:
response = cursor.fetchone()
cursor.close()
return response
我试过下面的代码作为测试
@mock.patch("lambda_function.database_connection")
@mock.patch("pymysql.cursors.Cursor.execute")
def test_sql_query_select(self, mock_database_connection, mock_execute):
mock_database_connection.return_value = "cursor"
mock_execute.return_value = "test"
self.assertEqual(lambda_function.sql_query_select("select", "table", "condition", "variable"), "execute")
但是出现以下错误,我不确定如何继续。
E AttributeError: 'str' object has no attribute 'execute'
您已经在尝试模拟 database_connection()
。您不需要也模拟 cursor.execute()
,因为您可以将您想要的行为注入 database_connection()
的 return 值。问题是您需要模拟对象 使用它们的地方 而不是定义它们的地方。看起来 sql_query_select()
在名为 lambda_function.py
的文件中,因此模拟看起来像这样:
@mock.patch(lambda_function.database_connection)
def test_sql_query_select(self, mock_database_connection):
mock_record = ('record one', 'record two')
mock_database_connection.return_value.fetchone.return_value = mock_record
result = lambda_function.sql_query_select("select", "table", "condition", "variable")
self.assert_equal(mock_record, result)
这种测试的一个问题是它完全忽略了 sql_query_select()
的参数。一种解决方案是验证是否调用了 database_connection.return_value.execute
。
这也不令人满意,因为您是在测试实现而不是行为。