2013-07-13 59 views
0

我在讀尼克霍奇斯的博客http://nickhodges.com/post/Delphi-Mocks-The-Basics.aspx這非常有趣。德爾福模擬和數據庫

但是它並沒有說我怎麼可以參照數據庫,它例如TQuery.Next or TQuery.ExecSQL or TQuery.FieldByName...語句測試類等

有沒有人面臨同樣的問題?如果是這樣,你是如何解決它的?

+0

歡迎StackOverflow上。很難說你在問什麼。您所指的文章是更長的系列文章的一部分,您可能會遇到問題的原因是,爲了使代碼可測試,您可能需要先重構代碼,以便使用一些適合的常用模式進行自動化測試。例如,對於TQuery,您可能需要使用接收此類TQuery對象的方法作爲參數,而TQuery對象可能需要是接口而不是對象。這只是一些猜測。 –

+0

@leonardo「您可能需要使用接收此類TQuery對象作爲參數的方法,而TQuery對象可能需要是接口而不是對象」您的意思是我必須將TQuery放入接口中嗎? –

+0

是的。反過來想一想 - 從一開始就使用接口進行設計。這樣一個基於TQuery的類將只是接口的特定實現。 [本文](http://blog.synopse.info/post/2012/10/14/Interfaces-in-practice%3A-dependency-injection,-stubs-and-mocks)可能有幫助,雖然它是特定於mORMot框架。 –

回答

1

我們在工作中所做的是讓存儲庫返回一個TDataSet。這樣,你創建了一個模擬/假的存儲庫(取決於如果你想測試多少測試方法被調用等)。例如:

TMyDatabaseRepository = class(TInterfacedObject, IMyDatabaseRepository) 
    // .. blah .. 
    function GetAllTheFun : TDataSet; 
    // .. blah .. 
end; 

TMyProcessThatAccessesTheDatabase = class 
    // .. blah .. 
public 
    constructor Create(const AMyDatabaseRepository : IMyDatabaseRepository);  
    // .. blah .. 
end; 

所以說到測試,我們傳遞一個模擬IMyDatabaseRepositoryGetAllTheFun實際上返回了帶有數據採樣數據的TKbmMemTable設置。

雖然我沒有使用過Delphi Mocks,但我確實記得你可以在'fly'(或類似的東西)上覆蓋方法,所以你可能不需要經歷創建一個單獨的類來實現IMyDatabaseRepository

編輯: 這是一個公平的大課題,試圖掩蓋這裏但覆蓋這種類型的東西網站(博客)的幾號:

+0

嗨尼古拉斯,謝謝你的回答。 因爲我不熟悉這個話題,你能詳細解釋一下整個過程是如何工作的嗎? 非常感謝 –

+0

我已經編輯了一些可能有用的鏈接,因爲這個主題相當大。 –

+0

非常感謝,尼古拉斯。非常感激 –