2012-10-11 83 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