连接数据库(即使它是内存中的)会减慢我的单元测试速度(目前需要超过 5 分钟)。
所以我正在考虑模拟数据库api。
使用真正的数据库 api,如果有任何 SQL 语法错误或输入错误的列名,它会引发异常。
在使用模拟对象时,我想不出任何方法来进行这种检查。
是否可以使用模拟对象来实现这一点?
当然!您可以使用自己的自定义函数模拟 db-api 函数,这些函数的行为方式符合您的要求:
from sqlite3.dbapi2 import DatabaseError
mock_db_connection = Mock()
def mock_execute(query, params):
if query == 'select firstname, lastname from student':
return [('jim', 'brown')]
elif query == 'select; firstname':
raise DatabaseError('You have an error in your SQL syntax')
mock_db_connection.execute = mock_execute
# from this point, if you've patched out your db connection with the mock,
# you can make tests against connection.execute...
我假设您正在使用模拟库。
但实际上 - 5 分钟并没有那么长。个人偏好,但我更喜欢保留这样的依赖项 - 它可以帮助您捕获 api 错误。你永远不会完美地模拟一个 API,数据库也不是那么严重的外部依赖......