【问题标题】:await with a TestScheduler使用 TestScheduler 等待
【发布时间】:2018-03-06 22:53:48
【问题描述】:

我正在使用 TestScheduler 来测试和设计我的序列,但是对于像下面这样的 sn-p,TestScheduler 挂起,而 DefaultScheduler 工作正常。在某些情况下可能会删除 await ,但这不是我想要的,原因很明显。那么有没有办法同时使用 TestScheduler 和 await 呢?

var testScheduler = new TestScheduler();
var response = await Observable.Return(Unit.Default).Delay(TimeSpan.FromTicks(1000),testScheduler);
testScheduler.AdvanceBy(1000);
response.ShouldNotBeNull();

【问题讨论】:

  • 认为这很明显,反正我更新了我的答案。
  • 确定可以发布什么内容?
  • @MarcoSalerno 他的例子是一个僵局。
  • 我做了什么?看不懂上面的代码不完整。下面的@MistyK 指出调度程序永远不会完成,我应该删除等待,但这是一个简单的案例,也许有办法保留它,因为我想使用它的灵活性。
  • 我在答案的编辑中做了解释。您可以为此方法创建一些帮助程序,以便轻松重用它。

标签: c# system.reactive


【解决方案1】:

由于await 的性质,您的示例永远不会以TestScheduler 完成。该程序将在await 语句处停止并等待您的可观察对象返回一个值。但是它永远不会返回,因为您需要通过调用 AdvanceBy 函数来移动您的测试调度程序,并且调用阻塞 await 之后。

如果您等待,那么它将永远不会进一步移动您的调度程序。我会在这里删除 async/await 并订阅。其次,您需要使用相同的 TestScheduler 实例。

            var ts = new TestScheduler();
            System.Reactive.Unit resp = null;

            var obs = Observable.Return(System.Reactive.Unit.Default).Delay(TimeSpan.FromTicks(1000),ts).Subscribe(r => { resp = r; });
            ts.AdvanceBy(1000);
            resp.ShouldNotBeNull();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    相关资源
    最近更新 更多