2012-02-07 40 views
6

所以這裏是場景,我正在重構一些意大利麪條代碼。我的第一個問題是一連串的類提出了其他類,我通過讓我想測試的類的ctor(Search.cs)將它需要的類作爲一個依賴項來解決這個問題,現在看起來像這樣。嘲笑從另一個類繼承的類

public Search(XmlAccess xmlFile, SearchDatabaseConnect searchDatabaseConnection) 
    { 
     this.xmlFile = xmlFile; 
     FsdcConnection = searchDatabaseConnection; 
     Clear(); 
    } 

我正在將它進一步上升。這很好,但我有一個小問題。

我ctor注入的類繼承自另一個類,我有Resharper,我已經提取了接口,但問題是依賴類從另一個具體類繼承 - 請參閱我的意思?

public class SearchDatabaseConnect : DatabaseConnect, ISearchDatabaseConnect 
{ // } 

我不知道該怎麼做關於DatabaseConnect的繼承?我該如何嘲笑?很顯然,如果那不在那裏,我會全部設置,我可以嘲笑一個ISearchDatabaseConnect並離開我們去,但是我被卡在具體類的繼承上。我相信在我的googl'ing失敗之前,人們已經遇到了這個問題,因爲找到這方面的例子。

在此先感謝您提供任何有用的建議。

+1

僅供參考「新增功能」通常稱爲實例化;-) – 2012-02-07 17:05:39

+0

是的,謝謝 - 這只是個人喜好的問題,我傾向於喜歡使用術語「新」,因爲它是a)代碼使用的關鍵字(很好OK n ew是)和b)似乎更像實例化這個詞的樂趣。 – Kenn 2012-02-08 03:36:45

回答

3

DatabaseConnect也有從中提取的接口?我想你應該能夠建立起來,如:

public interface IDatabaseConnect 

public class DatabaseConnect : IDatabaseConnect 

public interface ISearchDatabaseConnect : IDatabaseConnect 

public class SearchDatabaseConnect : DatabaseConnect, ISearchDatabaseConnect 

現在製作Mock<ISearchDatabaseConnect>將得到所有來自這兩個接口的「東西」。


側面說明,你的方法/構造函數應該有可能採取的接口,而不是具體的:

public Search(XmlAccess xmlFile, ISearchDatabaseConnect searchDatabaseConnection) { ... } 

這樣,你可以注入模擬,如:

var mockedSearchDatabaseConnect = new Mock<ISearchDatabaseConnect>(); 
var search = new Search(xmlFile, mockedSearchDatabaseConnect.Object); 
+0

啊...很明顯! – Kenn 2012-02-07 16:56:47

+0

是的,對!我明白你的意思了。 – Kenn 2012-02-08 03:17:17