【发布时间】:2015-01-25 15:01:12
【问题描述】:
我在测试使用基于任务的服务的响应式代码时遇到问题。在我的测试类中,我使用任务并使用 ToObservable 来做反应性的事情。
public void Method()
{
_svc.MyTaskServiceMethod().ToObservable().Select(....) //pipe it elsewhere and do interesting things.
}
现在在单元测试中,我正在测试一些时间(使用 Moq 作为服务)
svcMock.Setup(x => x.MyTaskServiceMethod()).Returns(() =>
Observable.Return("VALUE", testScheduler)
.Delay(TimeSpan.FromMilliseconds(100), testScheduler)
.ToTask()
);
问题在于,尽管在 Return/Delay 调用中使用了测试调度程序,但任务本身仍在单独的线程上完成。我通过将当前托管线程 ID 的几个控制台写入添加到代码中来看到这一点。
svcMock.Setup(x => x.MyServiceMethod()).Returns(() =>
{
var task = Observable.Return("VALUE", testScheduler)
.Delay(TimeSpan.FromMilliseconds(1000), testScheduler)
.Do(x => { Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + " Obs"); })
.ToTask();
task.ContinueWith((_) =>
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId.ToString() + " Task");
});
return task;
});
Do(..) 在主测试线程上执行,并且在我期望的 testSchduler.AdvanceBy(..) 调用之后发生。
任务延续仍在一个单独的线程中进行,并且基本上在单元测试主体完成之前不会执行。因此,在我的目标主体中,没有任何东西真正通过我的 task.ToObservable() observable。
【问题讨论】:
-
您的测试调度程序是什么?你在使用 Rx-Testing 库 (nuget.org/packages/Rx-Testing) 吗?
-
是的,它是 TestScheduler 对象。
标签: unit-testing system.reactive