使用ObserveOnDispatcher对IObservable <T>进行单元测试

jit*_*dea 5 c# linq reactiveui

我需要测试一段代码

        var watcher = new FakeIFileSystemWatcher();
        watcher.FilesToBeImported
            .ObserveOnDispatcher()
            .Subscribe(list.Add);
Run Code Online (Sandbox Code Playgroud)

所以我创建了这个小单元测试,但我不能让它通过原因list.Count始终为0

    [Test]
    public void Foo()
    {
        var list = new List<string>();

        var watcher = new FakeIFileSystemWatcher();
        watcher.FilesToBeImported
            .ObserveOnDispatcher()
            .Subscribe(list.Add);

        Task task = Task.Factory.StartNew(() =>
        {                
            watcher.AddFile("cc");
            watcher.AddFile("cc");
            watcher.AddFile("cc");
        }, TaskCreationOptions.LongRunning);
        Task.WaitAll(task);

        Assert.AreEqual(3, list.Count);
    }
Run Code Online (Sandbox Code Playgroud)

如果我注释掉这个方法

            .ObserveOnDispatcher()
Run Code Online (Sandbox Code Playgroud)

它通过但我如何使用ObserveOnDispatcher()?

Mar*_*age 6

如果您使用ObserveOnDispatcher,则为"调度程序"创建依赖项,这意味着您需要一个窗口和一个消息循环.要在单元测试中解决此问题,您可以改为使用ObserveOn使用调度程序的方法,然后使用依赖注入来注入正确的调度程序.对于单元测试,您可以使用Scheduler.Immediate和用于您可以使用的实际应用程序DispatcherScheduler.Instance.请注意,还存在一个TestScheduler对于在虚拟时间运行单元测试非常有用的东西.

  • @ scott4dev:我的观点是你有时需要修改被测系统以使其可以进行单元测试.例如,如果您访问数据库,则必须为数据库创建一个接口,允许您存根数据库访问等.您的解决方案当然可以避免这种情况. (3认同)

jit*_*dea 1

我使用我在这里找到的类 DispatcherUtil 解决了 在单元测试中使用 WPF Dispatcher

现在我的代码如下

    [Test]
    public void Foo()
    {
        var list = new List<string>();

        var watcher = new FakeIFileSystemWatcher();
        watcher.FilesToBeImported
            .ObserveOnDispatcher()
            .Subscribe(list.Add);

        Task task = Task.Factory.StartNew(() =>
        {
            watcher.AddFile("cc");
            watcher.AddFile("cc");
            watcher.AddFile("cc");
            watcher.AddFile("cc");
        }, TaskCreationOptions.LongRunning);
        Task.WaitAll(task);
        DispatcherUtil.DoEvents();
        Assert.AreEqual(4, list.Count);
    }
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力