2012-10-11 121 views
3

连接数据库(即使它是内存中的数据库)会降低我的测试速度(目前需要超过5分钟)。如何模拟数据库API?

所以我正在考虑嘲笑数据库API。

对于真正的数据库API,如果有任何SQL语法错误或错误的列名称,它会引发异常。

虽然对于模拟对象,我想不出有任何办法来做这种检查。

是否有可能使用模拟对象来完成此操作?

+0

以同样的方式,你嘲笑其他的API :) – Ankush

回答

3

当然!你可以模拟出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... 

我假设你正在使用的mock库。

但真的--5分钟不是长。个人喜好,但我更喜欢保持这样的依赖 - 它可以帮助你捕捉API错误。你永远不会完美地模拟出了一个API,和数据库是不是严重的外部依赖...

+1

如果运行单元测试需要5分钟就不会经常运行它们。单元测试永远不会太快。单元测试不是为了捕捉“API错误”。这就是集成和回归测试的目的。如果您使用外部API,并且要确保其行为与预期相同,请为其编写回归测试。这个测试可能会比单元测试慢,但你也不需要经常运行它们,因为API及其行为不会一直改变。 – EricSchaefer

+1

嘿,只是你知道,你的最后一行有错误。 'mock_db_connection.execute = mock_execute'应该放在左侧缩进的新行中。感谢摩根 –

+0

!我认为这是对的。 – hwjp