测试Rx和TPL的组合



我正在努力弄清楚如何使这个测试通过:

[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;
    });

相关内容

  • 没有找到相关文章

最新更新