Автономный пример и разработка для программирования на основе интерфейса - PullRequest
4 голосов
/ 06 января 2011

В ответ на этот вопрос здесь Джон Скит ответил: >>

Вы можете тестировать с помощью насмешек очень легко (без насмешек над классами, что уродливо)

Я бы хотел лучшего понимания на отдельном примере, разрабатывающем этот аспект ... и до, (некрасиво), и после (на основе интерфейса) сценариев в C #.

А также, кроме того, если в самом .NET Framework BCL есть пример, это было бы замечательно

Ответы [ 2 ]

3 голосов
/ 06 января 2011

Скажем, у вас есть этот метод для извлечения всех имен людей из файла:

string[] GetNamesFrom(string path) { }

Чтобы протестировать этот метод, вам потребуется указать путь к существующему файлу, который требует некоторой настройки.

Сравните это с этим методом:

string[] GetNamesFrom(IFile file)

Если IFile содержит метод GetContents(), то ваша «реальная» реализация этого интерфейса может получить доступ к файловой системе, а ваш фиктивный класс может просто вернуть ваши тестовые входные данные.

Использование фиктивной библиотеки, такой как moq (http://code.google.com/p/moq/)), это становится действительно простым:

var fileMock = new Mock<IFile>();
fileMock.Setup(f => f.GetContents()).Returns(testFileContents));
Assert.Equals(expectedNameArray, GetNamesFrom(fileMock.Object));

Запись файла в файловую систему перед тестированием может показаться не слишком сложной настройкой, но если вы выполняете много тестов, это превращается в беспорядок. Используя интерфейсы и макеты, все настройки выполняются в рамках вашего метода тестирования.

0 голосов
/ 06 января 2011

Пересмешивающие классы могут стать ужасными, если вы реорганизуете существующий код.Представьте себе класс:

public class A
{
    private B _instanceOfB;

    public void DoSomethingWithInstanceOfB()
    {
        // do something with _instanceOfB
    }
}

Если вы хотите смоделировать A, вам нужно не только извлечь интерфейс и рефакторинг по всему вашему коду, но вам также может понадобиться начать макетирование BИ так далее, потенциально до бесконечности, в условиях предприятия.Конкретный пример мог бы быть, если бы B был классом, который управляет доступом к ресурсу, такому как база данных.

...