我正在努力弄清楚如何使这个测试通过:
[Fact]
public void scheduler_test()
{
var scheduler = new TestScheduler();
var value1Set = false;
var value2Set = false;
Observable.Return(true)
.Delay(TimeSpan.FromMilliseconds(100), scheduler)
.Subscribe(_ => value1Set = true);
Observable.Return(true)
.Delay(TimeSpan.FromMilliseconds(100), scheduler)
.Subscribe(async _ =>
{
await Task
.Delay(500)
.ContinueWith(__ => value2Set = true);
});
Assert.False(value1Set);
Assert.False(value2Set);
scheduler.AdvanceBy(TimeSpan.FromMilliseconds(500).Ticks);
Assert.True(value1Set);
Assert.True(value2Set);
}
它目前在最终断言上失败。我以为async
订阅会阻止,直到等待的Task
完成,但事实似乎并非如此。
谁能解释为什么这不起作用,以及应该如何测试这样的组合场景?
你不能将 TPL 与 TestScheduler 一起使用。Task.Delay 将等待 500 实际毫秒,而不是模拟毫秒。您需要使用与 Rx 兼容的延迟版本,例如 Observable.Timer
.
在不相关的笔记上,不要在Subscribe
中使用异步方法,而是写这样的东西:
Observable.Return(true)
.Delay(TimeSpan.FromMilliseconds(100), scheduler)
.SelectMany(async _ => await Task.Delay(500))
.Subscribe(
{
value2Set = true;
});