5

我需要测试一段代码

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

所以我创建了这个小单元测试,但我无法通过原因列表。计数始终为 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);
    }

如果我注释掉方法

            .ObserveOnDispatcher()

它通过了,但我怎样才能让它与 ObserveOnDispatcher() 一起工作?

4

3 回答 3

7

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

于 2012-07-04T15:41:48.700 回答
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);
    }

它就像一个魅力

于 2012-07-05T07:08:28.727 回答
0

您可以尝试像这样调用您的方法:

var dispatcher = Application.Current != null ? Application.Current.Dispatcher : Dispatcher.CurrentDispatcher;

 dispatcher.Invoke((Action)(() => YourMethodToTest());
于 2013-09-23T06:08:54.477 回答