2012-01-05 111 views
1

我在SOF和Google的結果上看過很多帖子。嘲笑是做什麼的?

還沒弄清楚嘲笑的價值。

從SOF」後的一個: What is Object Mocking and when do I need it?

對象嘲諷是用來保持依賴你的單元測試。有時你會有一個像「SelectPerson」一樣的測試,它將從數據庫中選擇一個人並返回一個Person對象。

要做到這一點,你通常需要對數據庫的依賴, 但是與對象嘲諷你可以模擬與 數據庫與模擬框架的相互作用,因此它可能會返回一個數據集,其 看起來像一個從數據庫返回,然後您可以測試您的代碼以確保它處理將數據集轉換爲對象的人員,而不是使用它來測試與數據庫 的連接存在。上面

實施例也存在於許多谷歌結果,像這樣的(代碼演練部分) http://quickduck.com/blog/2008/02/18/unit-testing-mocking-and-dependency-injection/

,但它只是得到的用於單元測試斷言100%的成功的方法,因爲我們設計的嘲笑方法&接口必須滿足TestCase。 它不能在測試中失敗,它不同於真實世界的數據庫。

+0

嘲弄是允許測試,而不使用DB的一種方式,它的使用會變成一個測試爲更多的集成測試。這有幾個優點,包括測試執行時間,但也不需要數據庫模式/ etc在* all *,允許開發繼續進行,即使DBA不在玩沙球。 – 2012-01-05 06:46:06

回答

0

那麼Mocking背後的基本概念可以幫助開發人員將他的代碼(他的業務邏輯)與其他代碼單元或與DB,文件系統或服務的任何外部連接隔離開來。

應該爲可測試性設計一個代碼,如果達到了這個目的,那麼開發人員知道他將從他的CUT(被測試的類)所依賴的接口接收到什麼值。就你而言,開發人員應該知道從數據庫中返回什麼值。他應該只關心檢查這些數據(從數據庫返回)是否按照他所實施的代碼的要求進行處理。

使所有測試通過的條件稱爲Over Mocking,這是由於對Test Doubles缺乏瞭解而造成的。對於您的特定情況,如果您有興趣測試查詢,而不想測試應用程序邏輯處理返回值的方式,那麼您可以嘗試使用一些內存數據庫,如HSQLDB或H2,這些數據庫速度更快。這樣你可以增加單元測試的範圍。但是許多開發人員寧願嘗試在集成測試中測試這些查詢,而不是單元測試。在實際的術語中,當你使用真實的數據庫來測試你的代碼時,那麼它就不再是一個單元測試。

要添加一個更多信息,如果您查詢數據庫,則根據具體情況,可以在結果集中返回一個或多個對象或不返回對象。所以你可以配置你的模擬/存根以返回其中的一個值。當你使模擬拋出異常像「沒有找到結果」,那麼這將是一個消極的情況。

0

採取例如這種類/方法:

class Foo { 

    ... 

    public static function instantiateFromDb(Database $db, $id) { 
     $record = $db->query("SELECT * FROM table WHERE id = $id"); 
     $foo = new self; 
     $foo->id = $record['id']; 
     ... 
     $foo->initialize(); 
     $foo->calibrate(); 
     return $foo; 
    } 

    ... 

} 

Foo::instantiateFromDb是有點複雜的方法,該方法用於實例從一個數據庫記錄的對象(是的,這主要是僞代碼)。要做到這一點,它取決於數據庫對象,它用來從數據庫中獲取條目。所以要測試這種方法,你需要一個帶有記錄的數據庫。這是相當大的依賴。您需要啓動並運行數據庫,您需要與其建立連接,您需要使用正確的數據填充數據庫,您需要希望它不會停止。當你想要做的只是測試Foo::instantiateFromDb方法時,它依賴於很多移動部件。

所以,你要做的就是你只需嘲笑Database對象。

public function testInstantiationFromDatabase() { 
    $mockDb = new Mock('Database'); 

    prepare $mockDb so it always returns a valid record 
    when its query() method is called... 

    $this->assertInstanceOf('Foo', Foo::instantiateFromDb($mockDb, 1)); 
} 

通過嘲笑,你知道作品(因爲它只做一個具體的事情:返回一個有效的記錄)的對象數據庫,你已經採取了巨大的依賴關係的方程,可以專注於測試僅方法你真的想測試。