【发布时间】:2012-07-04 15:16:13
【问题描述】:
我需要测试一段代码
var watcher = new FakeIFileSystemWatcher();
watcher.FilesToBeImported
.ObserveOnDispatcher()
.Subscribe(list.Add);
所以我创建了这个小单元测试,但我不能让它通过因为 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);
}
如果我注释掉方法
.ObserveOnDispatcher()
它通过了,但我怎样才能让它与 ObserveOnDispatcher() 一起工作?
【问题讨论】:
-
失败时
list.Count的值是多少? -
我使用我在这里找到的类 DispatcherUtil 解决了stackoverflow.com/questions/1106881/…
-
我只想指出,通过在单元测试中使用并发(隐式或显式),您的能力确实受到了限制。在这里,您有 Tasks 和 Dispatcher,您没有提供任何“接缝”,您可以在其中将它们替换为测试替身(模拟/存根)。就像(我假设)您在产品代码中注入 IFileSystemWatcher 的真实实现一样,您将注入一个 SchedulerProvider,它在产品中为您提供真正的并发,但在您的单元测试中测试调度程序。更快的单元测试,更容易测试超时等其他事情。
标签: c# linq reactiveui