【问题标题】:Unit test FileWatcher in c#c#中的单元测试FileWatcher
【发布时间】:2017-02-20 17:33:06
【问题描述】:

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

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% 的覆盖率。 任何帮助将不胜感激。谢谢

【问题讨论】:

  • 我正在考虑对类似功能进行单元测试,但是由于您无法模拟文件存储,我会说您不能 100% 覆盖这样的事情(意见)。
  • 我能想到的唯一要测试的是 _watcher 为 dirsToWatch 添加了文件系统观察程序
  • 你能修改被测代码吗?我会建议抽象文件观察者。
  • 你到底想测试什么,FileWatcher的配置还是工作?

标签: c# unit-testing


【解决方案1】:

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

【讨论】:

  • 嗨 Martin,感谢我使用 Typemock Isolator 方法获得 100% 的覆盖率
【解决方案2】:

FileWatcher 取决于环境(在这种情况下为文件系统)。涉及环境的事物不能进行单元测试。您可以:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多