2010-07-12 100 views
0

我試圖用PHPUnit爲我們的各種類/方法/函數編寫一些測試。其中一些需要數據庫連接。很顯然,我想Mock這些,所以我不改變我們的數據庫。嘲笑數據庫連接

有人能告訴我一些解釋如何做到這一點的代碼?我看到很多Mocking的例子,但沒有具體關於模擬數據庫。

回答

3

一般而言,您不想模擬數據庫或任何其他類似的外部依賴項。最好用別的方法將數據庫包裝到你的代碼中,然後你可以模擬包裝器。因爲數據庫可能有多種不同的交互方式,而你的代碼和測試只關心一兩個數據庫,你的數據庫包裝器只需要實現它們。這樣嘲笑包裝應該很簡單。 您還需要對包裝進行一些集成測試,以檢查它是否按照應該做的那樣進行,但只有少數這些測試,因此它們不會放慢單元測試的速度。

+0

我猜「嘲笑數據庫」是錯誤的術語。我們在內部使用ezSQL,並且我想嘲笑它,以便我可以測試其他所有內容...... – 2010-07-14 20:24:02

0

數據庫

的模擬我會寫周圍的調用應用程序的數據庫的包裝。
實例僞碼

CallDataBase (action, options,...) { 
    // Code for connectiong to DataBase 
} 

然後你只需模擬該函數的只是你想其他任何功能

CallDataBase (action, options,...) { 
    return true; 
} 

這樣你可以不用理會它是一個web服務嘲弄數據庫或數據庫連接或其他。你可以讓它返回真實或任何其他。

測試你的系統是如何處理數據庫響應

要採取這樣的想法一步,讓你的測試更加強大,你可以使用某種測試參數或環境參數來控制嘲笑會發生什麼關數據庫方法。然後,您可以成功測試代碼如何處理來自數據庫的不同響應。
再次在僞代碼(假設你的數據庫返回XML答案):

CallDataBase (action, options,...) { 
    if TEST_DATABASE_PARAMETER == CORRUPT_XML 
     return "<xml><</xmy>"; 
    else if TEST_DATABASE_PARAMETER == TIME_OUT 
     return wait(5000); 
    else if TEST_DATABASE_PARAMETER == EMPTY_XML 
     return ""; 
    else if TEST_DATABASE_PARAMETER == REALLY_LONG_XML_RESPONSE 
     return generate_xml_response(1000000); 
} 

並測試匹配:

should_raise_error_on_empty_xml_response_from_database() { 
    TEST_DATABASE_PARAMETER = EMPTY_XML; 
    CallDataBase(action, option, ...); 
    assert_error_was_raised(EMPTY_DB_RESPONSE); 
    assert_written_in_log(EMPTY_DB_RESPONSE_LOG_MESSAGE); 
} 
... 

等等,你明白了吧。 請注意,我所有的例子都是陰性測試用例,但這當然也可以用來測試陽性測試用例。

好運