【问题标题】:CoreDispatcher in a unit test with reactive extensionsCoreDispatcher 在带有响应式扩展的单元测试中
【发布时间】:2013-02-28 06:53:35
【问题描述】:

我的 Windows 8 应用商店应用中有以下代码:

    public static void ConvertUpdateStreamToCollection<T>(this IObservable<UpdateInfo<T>> input, ObservableCollection<T> list)
    {
        input
            .ObserveOnDispatcher()
            .Subscribe(upInfo => UpdateList(upInfo, list));
    }

那个 ObserveOnDispatcher 在公元前就在那里。这通常会在后台线程上调用,当它更新可观察列表时,我需要它在 UI 调度程序上。第一次订购时,我运行应用程序时看起来效果很好。

但我希望通过单元测试来测试它。我正在使用内置的 MSTest。然而,ObserveOnDispatcher 抛出,抱怨没有有效的 Window 可以从中获取 CoreDispatcher。

我在堆栈溢出的其他地方看到了 WPF 的变通方法。但这看起来只是让调度程序运行的东西。这个错误似乎更根本。有已知的解决方法吗?

【问题讨论】:

    标签: unit-testing mstest windows-store-apps system.reactive


    【解决方案1】:

    (编辑:更好的格式,因为我有键盘而不是手机)

    还有另一种实现相同功能的方法:

    .ObserveOnDispatcher() 
    

    相当等同于:

    .ObserveOn(new DispatcherScheduler(Dispatcher.CurrentDispatcher))
    

    现在,代替 DispatcherScheduler,使用如下类:

    public static class Schedulers
    {
        public static IScheduler Dispatcher {get; internal set;}    
    }
    

    并将用法更改为:

    .ObserveOn(Schedulers.Dispatcher)
    

    例子:

    void Main()
    {
        // For normal usage, we'll set this to the proper DispatcherScheduler
        Schedulers.Dispatcher = new DispatcherScheduler(Dispatcher.CurrentDispatcher);
    
        // Do stuff
        new Thingy().DoStuff();
    
        // for testing usage, we'll set this to be the immediate scheduler
        Schedulers.Dispatcher = Scheduler.Immediate;
    
        // Do stuff 
        new Thingy().DoStuff();
    }
    
    public class Thingy
    {
        public void DoStuff()
        {
            var query = Observable.Range(0, 10).ObserveOn(Schedulers.Dispatcher);
            query.Subscribe(Console.WriteLine);
        }
    }
    

    【讨论】:

    • 谢谢。您的帖子让我意识到我可以查看 Rx 源代码 (rx.codeplex.com/SourceControl/changeset/view/7881e17c060b#Rx/…)。
    • 这里有一个简单的问题。您正在使用 Dispatcher.CurrentDIspatcher... 对于 Windows 商店应用程序的整个生命周期,这将是同一件事吗?您是否获得与“Window”对象相关联的不同对象(默认情况下获取它们的位置)?
    • 我想到的另一个解决方案是创建一个 shell ObserveOnMyDispatcher,它在测试模式下运行时变成空操作,在 WD 环境中运行时变成“官方”ObserveOnDispatcher,因为这可以解决任何问题在 WS 应用程序上运行期间调度程序发生变化的机会...
    • Dispatcher.CurrentDispatcher 很棘手;使用 Application.Current.Dispatcher 可能会更好。 CurrentDispatcher 实际上可以导致创建新的调度程序。
    • 哦!这很奇怪。我是从 Rx 的源代码中得到的!好的,那我换那个。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-11
    相关资源
    最近更新 更多