2013-09-28 2 views
1

Я только что закончил книгу «Искусство модульного тестирования» и получил архитектурный вопрос о тестовом шаблоне.создание интерфейсов для издевательских библиотек dotnet

Для тестирования, если используется метод внешней библиотеки, книга советует сделать оболочку с интерфейсом. Таким образом, вы можете использовать интерфейс для издевательств. Я сделал пример для использования метода .net File.Exists

public interface IFile 
{ 
    bool Exists(string path); 
} 


public class File : IFile 
{ 
    bool IFile.Exists(string path) 
    { 
     return System.IO.File.Exists(path); 
    } 
} 


[TestMethod] 
[ExpectedException(typeof(System.IO.FileNotFoundException))] 
public void Constructor_WithNonExistingFile_ThrowsFileNotFoundException() 
{ 
    Mock<IFile> fileMock = new Mock<IFile>(); 
    Mock<ICompositionContainer> compositionMock 
     = new Mock<ICompositionContainer>(); 

    fileMock.Setup(f => f.Exists(It.IsAny<string>())).Returns(false); 

    Loader<object> loader = new Loader<object>(
     "testfile", 
     fileMock.Object, 
     compositionMock.Object); 
} 

Мой вопрос об этом, если это хорошая практика, и если да, то я должен сделать интерфейсы и оберток для всех .net методов/классов Я хочу контрольная работа?

+0

Чтобы быть более точным, вы спрашиваете о написании оберток для всех методов/классов .net **, используемых вашим кодом **, который вы хотите проверить. Вы не тестируете методы/классы .net. – BartoszKP

+0

Точно, я только хочу проверить свой код, но мне нужно проверить, правильно ли он использует библиотеки. –

+0

Честно говоря, не очень-то ответить здесь, как я думаю, у вас нет выбора. – BartoszKP

ответ

1

Сделав много издевательств, я пришел к выводу, что насмешка должна быть последней инстанцией. Я нахожу слишком глупые тесты связей для кода и вообще маскирует непроверяемый код. Такие тесты, которые слишком сильно связаны с реализацией, считаются хрупкими. В этом случае вместо создания интерфейса оболочки вокруг файлов ввода/вывода .NET File я просто использовал бы файлы ввода-вывода файлов напрямую. Я буду использовать реальную зависимость, так как файловая система существует на тестовой машине. Затем, в моем тестовом методе Setup(), я убеждаюсь, что предварительное условие для теста выполнено, например, при создании файла. В методе срыва я сделаю все необходимое для очистки.

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

Смежные вопросы