Rx反应式扩展Observeondispatcher单元测试错误:当前线程没有与之关联的Dispatcher

Pin*_*ani 4 wpf unit-testing dispatcher system.reactive observable

我想对包含如下注册的视图模型进行单元测试:

 public SampleViewModel(IUnityContainer container)
    {
...
    Observable.FromEventPattern<PropertyChangedEventArgs>(gridViewModel, "PropertyChanged")
                    .**ObserveOnDispatcher()**
                    .Subscribe(_ => this.Update());
...
}
Run Code Online (Sandbox Code Playgroud)

当我运行单元测试时,它告诉我" 当前线程没有与之关联的Dispatcher. "到达此代码时.

一种解决方案是使用调度程序,但我不想修改Viewmodel.

是否有解决方案使单元测试通过此语句而不会出现错误?

Lee*_*ell 6

我建议您提供自己的IScheduler实现,ObserveOn(IScheduler)而不是使用ObserveOnDispatcher()运算符.我已经使用了加载a DispatcherFrame或a的技术,Dispatcher但问题是你仍在使用Dispatcher.最终我发现你只是"从悬崖上掉下来",特别是一旦你有长时间运行的背景线程.按照"单元测试中没有线程"的指导原则,不要让调度员靠近你的ViewModels!你的单元测试运行得更快,更快.

处理此问题的一个更好的方法是注入一个接口,该接口可以访问您的Dispatcher Scheduler(通过IScheduler接口).这允许您在暴露的实现中替换TestScheduler.您现在可以控制单元测试的时间.您可以控制和验证为每个调度程序编组的操作.

这是一个非常古老的(前Rx)帖子'单元'测试WPF与2009年初的Dispatcher调用.当时这似乎是一个好主意.

https://leecampbell.com/2009/02/17/responsive-wpf-user-interfaces-part-5/

有关使用Rx进行测试的更多信息,请参阅TestScheduler我在Rx上的其他站点

http://introtorx.com/Content/v1.0.10621.0/16_TestingRx.html