2017-02-20 4 views
0

У меня есть класс, который наблюдает за файлы, используя следующий метод:Unit тест FileWatcher в C#

public FileWatcher(List<string> dirsToWatch, string filter, OnChange onChange) 
    { 
     OnChangeEnt = onChange; 

     foreach (var dir in dirsToWatch) 
     { 
      var watcher = new FileSystemWatcher(dir); 
      watcher.Filter = filter; 
      watcher.Changed += new FileSystemEventHandler(onChange); 
      watcher.Created += new FileSystemEventHandler(onChange); 
      watcher.Renamed += new RenamedEventHandler(OnChangeHandler); 
      watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.LastAccess | NotifyFilters.FileName; 
      watcher.IncludeSubdirectories = true; 
      watcher.EnableRaisingEvents = true; 
      _watchers.Add(watcher); 
     } 
    } 

Я просто хотел знать, как бы я модульное тестирование этот метод, чтобы получить 100% охват. Любая помощь была бы поистине оценена. Спасибо

+0

Я думал о модульном тестировании подобных функций, однако, поскольку вы не можете имитировать хранилище файлов, я бы сказал, что вы не можете на 100% покрыть такую ​​вещь (мнение). – Tatranskymedved

+1

Единственное, что я могу проверить, это то, что _watcher имеет наблюдателей файловой системы, добавленных для dirsToWatch. –

+0

http://stackoverflow.com/questions/1528134/unit-testing-file-io – Tatranskymedved

ответ

3

Вы всегда можете использовать насмешку (например, Typemock Isolator), которая будет изолировать вызываемые методы от системных вызовов, чтобы вы могли издеваться над их поведением и писать тесты, предназначенные только для одного варианта использования в вашем метод. Вы также можете использовать специальный каталог, который предназначен только для этого теста, но вам нужно будет написать правильные сценарии инициализации и разрыва.

+1

Привет, Мартин, мне удалось получить 100% -ное покрытие, используя метод Typemock Isolator. – Cory

0

FileWatcher зависит от среды (в данном случае файловая система). Вещи, которые связаны с окружающей средой, не могут быть проверены на единицу. Вы можете:

  • Аннотация функциональность FileSystemWatcher через некоторый интерфейс, сделать FileWatcher зависят от этого интерфейса, и фиктивный интерфейс для юнит-тестирования FileWatcher. Это имеет смысл, если у вас есть относительно сложное поведение, которое использует класс, зависящий от среды. И вы хотите проверить это поведение.

  • Приемочные испытания для вашего применения. Это будет включать сквозные тесты с добавлением/удалением/редактированием файлов в реальной файловой системе и проверкой того, что ваше приложение реагирует на эти изменения по мере необходимости.