c#中的单元测试FileWatcher

时间:2017-02-20 17:33:07

标签: c# unit-testing

我有一个使用以下方法监视文件的类:

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%的覆盖率。 任何帮助都会非常感激。谢谢

2 个答案:

答案 0 :(得分:3)

您总是可以使用模拟(如Typemock Isolator)来隔离系统调用中的被调用方法,这样您就可以模拟它们的行为并编写仅针对方法中一个单独用例的测试。您还可以使用一些仅用于此测试的特殊目录,但您必须编写正确的初始化和拆卸脚本。

答案 1 :(得分:0)

FileWatcher取决于环境(本例中为文件系统)。涉及环境的事情无法进行单元测试。你可以:

  • FileSystemWatcher通过某个接口的抽象功能,make FileWatcher依赖于该接口,而模拟接口用于FileWatcher的单元测试。当你有一些使用环境相关类的相对复杂的行为时,这是有道理的。并且您想要验证该行为。

  • 对您的申请进行验收测试。这将涉及在真实文件系统中添加/删除/编辑文件的端到端测试,并验证您的应用程序是否根据需要对这些更改做出反应。