如何使用TestScheduler完成超时行为?

时间:2016-04-18 17:50:09

标签: c# unit-testing system.reactive scheduler reactive-programming

我已经创建了以下帮助方法来帮助测试observables:

    public static void ExecuteObservableTest<T>(IObservable<T> observable, Action action, Action assert, bool expectTimeout, int timeout = 500)
    {
        Exception ex = null;
        var scheduler = new TestScheduler();
        observable.Timeout(TimeSpan.FromMilliseconds(timeout)).ObserveOn(scheduler).Subscribe(_ => { }, e => ex = e);
        action();
        scheduler.AdvanceBy(TimeSpan.FromMilliseconds(timeout).Ticks + 1);
        assert();
        if (expectTimeout) Assert.IsNotNull(ex);
        else Assert.IsNull(ex);
    }

只要我不期待超时,事情就会很好。对于我确实期望超时的测试用例,此方法永远不会到达OnException方法。使用TestScheduler实现此目的的正确方法是什么?

我还应该注意,超时是软超时,这意味着如果observable在规定的时间内没有完成,它永远不会完成 - 但是在observable本身内没有定义相应的超时。

1 个答案:

答案 0 :(得分:2)

您需要向TestScheduler Timeout提供this overload

var scheduler = new TestScheduler();
observable.Timeout( TimeSpan.FromMilliseconds(timeout), scheduler)
          .Subscribe(_ => { }, e => ex = e);