2016-04-28 76 views
0

能不能創建一個模擬的構造函數初始化模擬在C#

public MetricsProvider(IConfig configData, IMetricsLogger log) 
{ 
    config = configData; 
    logger = log; 
    oracleDAL = new OracleDataAccess(config, logger); 
    MetricsData = new DataCollector(); 
} 

步驟我做: Creatde爲IConfigIMetricsLogger模仿對象。 我試着打電話給MetricsProvider(config,logger),但是它的引用與Oracle連接並且無法獲得連接或模擬連接對象。

+0

您能否描述一下您正在編寫的測試以及您想要模擬的依賴關係? –

+0

我想模擬MetricsProvider類。它將基本上從db(OracleDataAccess)中讀取數據並返回一個DataCollector作爲List。 – gsc0441

+0

你爲什麼要嘲笑它?它是你想測試的另一個類的依賴嗎?當你測試時,你測試一個真實的類,你只是嘲笑它的依賴。請詳細描述您想要測試的真實課程,您想要測試的行爲以及您想要模擬的依賴關係。 –

回答

0

這實際上是依賴注入爲什麼是有益的完美例子。你想要的是測試MetricsProvider。但是因爲MetricsProvider內部創建了OracleDataAccessDataCollector的實例,所以如果不測試這些類,則不能測試MetricsProvider

但這些類依賴於什麼?他們是否需要額外的依賴關係,比如沒有查看這些類的源代碼就無法看到的app.config設置? (如果這些類依賴於其他具有更多依賴關係的類,那該怎麼辦?)

如果測試失敗,則很難判斷出缺陷是在MetricsProvider還是隱藏在某些其他類中的未知依賴關係。

修復它的方法是將接口傳遞給由OracleDataAccess實現的構造函數。如果該類尚未實現接口,則可以創建與現有類相對應的新接口。或者,如果您只需要一種方法,則可以定義一個更具體的接口並將OracleDataAccess包裝在實現該接口的類中。

然後MetricsProvider將取決於一個接口注入構造函數,你將能夠模擬。由於該模擬將使您能夠準確確定IOracleDataAccess的行爲,現在您可以單獨測試MetricsProvider