2012-02-07 21 views
6

Tak oto scenariusz, jestem refactoring niektóre spaghetti code. Moim pierwszym problemem był łańcuch klas, który wprowadził inne klasy, naprawiłem to, czyniąc ctor klasy, którą chcę przetestować (Search.cs), biorąc klasę, której potrzebuje, jako zależność, teraz wygląda to tak.Kpiny z klasy, która dziedziczy z innej klasy

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

Rozbudowuję go jeszcze wyżej. To wszystko jest dobre, ale mam mały problem.

Klasa, którą wstrzykiwam ctor dziedziczy z innej klasy, mam Resharpera i mam wyodrębnione interfejsy, ale problem polega na tym, że klasa zależności dziedziczy z innej konkretnej klasy - zobacz co mam na myśli?

public class SearchDatabaseConnect : DatabaseConnect, ISearchDatabaseConnect 
{ // } 

Nie wiem co zrobić z dziedziczeniem na DatabaseConnect? Jak mam to udawać? Oczywiście, gdyby tego nie było, byłbym cały zestaw, mógłbym kpić z ISearchDatabaseConnect i odejść, ale utknąłem na dziedziczeniu konkretnej klasy. Jestem pewny, że ludzie do tego doszli, zanim mój gonitwę nie udał się, gdy przyszło znaleźć przykłady na ten temat.

Z góry dziękuję za wszelkie przydatne sugestie.

+1

Tylko w celach informacyjnych "tworzenie nowej wersji" nazywane jest ogólnie tworzeniem instancji ;-) –

+0

tak, dziękuję - to po prostu kwestia osobistych preferencji, lubię termin "nowość", ponieważ to a) jest słowem kluczowym, którego używa kod (dobrze OK n ew is) i b) wydaje się być bardziej zabawny od tego, który powstaje. – Kenn

Odpowiedz

3

Czy interfejs DatabaseConnect jest również wyodrębniony? Myślę, że powinieneś być w stanie ustawić go tak:

public interface IDatabaseConnect 

public class DatabaseConnect : IDatabaseConnect 

public interface ISearchDatabaseConnect : IDatabaseConnect 

public class SearchDatabaseConnect : DatabaseConnect, ISearchDatabaseConnect 

A teraz dokonywania Mock<ISearchDatabaseConnect> dostanie wszystkie „rzeczy” z obu interfejsów.


marginesie, metoda/konstruktor nie powinien chyba wziąć w interfejsie, a nie konkretny:

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

ten sposób można wstrzyknąć mock, jak:

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

Ah ... To oczywiste! – Kenn

+0

tak, prawda! Rozumiem, co masz na myśli. – Kenn