Я использую System.IO.FileSystemWatcher в одной из своих служб. Я хочу проверить, что при изменении отслеживаемого файла я получаю уведомление.

Я думал о том, чтобы фоновый поток изменил файл. В тесте я бы присоединился к этой теме. Тогда я могу утверждать, что вызываются правильные события. Я мог бы подписаться на обратный вызов для захвата, если событие было вызвано.

Я не проводил никакого тестирования с участием потоков, поэтому я не уверен, что это лучший способ справиться с этим или есть какие-то встроенные способы в Moq или MSpec, которые помогут в тестировании.

3
JD. 29 Янв 2013 в 13:18

1 ответ

Лучший ответ

В Moq или MSpec нет ничего специально встроенного, что помогло бы вам в этом, за исключением некоторого интересного синтаксиса или функций, которые помогут вам организовать ваш тест. Я думаю, ты на правильном пути.

Мне любопытно, как ваша служба предоставляет уведомления об изменении файлов. Открывает ли он их для тестирования? Или FileSystemWatcher полностью скрыт внутри службы? Если служба не просто передает уведомление о событии, вам следует извлечь данные мониторинга файлов, чтобы их можно было легко протестировать.

Вы можете сделать это с помощью событий .NET, обратных вызовов или чего-то еще. Независимо от того, как вы это делаете, я бы написал тест примерно так ...

[Subject("File monitoring")]
public class When_a_monitored_file_is_changed
{
    Establish context = () => 
    {
        // depending on your service file monitor design, you would
        // attach to your notification
        _monitor.FileChanged += () => _changed.Set();

        // or pass your callback in
        _monitor = new ServiceMonitor(() => _changed.Set());
    }

    Because of = () => // modify the monitored file;

    // Wait a reasonable amount of time for the notification to fire, but not too long that your test is a burden
    It should_raise_the_file_changed_event = () => _changed.WaitOne(TimeSpan.FromMilliseconds(100)).ShouldBeTrue();

    private static readonly ManualResetEvent _changed = new ManualResetEvent();
}
2
Anthony Mastrean 6 Фев 2013 в 00:24
Спасибо, Энтони, у меня был мой FileSystemWatcher в службе с такими методами уведомления о событиях, как вы описали. Блестящий ответ, теперь мои тесты становятся проще.
 – 
JD.
8 Фев 2013 в 15:37
Пожалуйста, Джей Ди. Сейчас я провожу много подобных тестов. Продолжайте задавать MSpec и вопросы по тестированию!
 – 
Anthony Mastrean
8 Фев 2013 в 19:12