Насмешка над классом, который наследуется от другого класса - PullRequest
6 голосов
/ 07 февраля 2012

Так что вот сценарий, я рефакторинг некоторого кода спагетти.Моей первой проблемой была цепочка классов, которая обновляла другие классы, я исправил это, заставив ctor класса, который я хочу протестировать (Search.cs), взять класс, который ему нужен, в качестве зависимости, теперь это выглядит так.

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

Я обновляю его дальше по цепочке.Это все хорошо, но у меня есть небольшая проблема.

Класс, который я внедряю ctor, наследует от другого класса, у меня есть Resharper, и я извлек интерфейсы, но проблема в том, что класс зависимостей наследует от другого конкретного класса - понимаете, что я имею в виду?

 public class SearchDatabaseConnect : DatabaseConnect, ISearchDatabaseConnect 
{ // }

Я не знаю, что делать с наследованием в DatabaseConnect?Как я это высмеиваю?Очевидно, что если бы этого не было, я был бы готов, я мог бы посмеяться над ISearchDatabaseConnect, и мы поехали, но я застрял в наследовании конкретного класса.Я уверен, что люди сталкивались с этим до того, как мой поиск был неудачным, когда дело дошло до поиска примеров по этому поводу.

Заранее благодарим за любые полезные предложения.

1 Ответ

3 голосов
/ 07 февраля 2012

Имеет ли 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...