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