【问题标题】:How to accomplish timeout behavior using TestScheduler?如何使用 TestScheduler 完成超时行为?
【发布时间】:2016-04-18 17:50:09
【问题描述】:

我创建了以下辅助方法来帮助测试 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 本身没有定义相应的超时。

【问题讨论】:

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


    【解决方案1】:

    您需要将TestScheduler 提供给Timeoutthis overload

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

    【讨论】:

    • 谢谢,@supertopia。当我尝试在同一语句中同时使用 Timeout 重载和 ObserveOn(scheduler) 时,后者似乎被忽略了,因此我期望超时的测试现在通过,而其他测试(以前通过)现在失败。我添加了一个 if-else 块来打开 expectTimeout。你知道为什么会发生这种情况吗?还有比 if 语句更优雅的解决方案吗?
    • 当然。使用scheduler.CreateObserver&lt;T&gt; 创建一个ITestableObserver。将可测试的观察者订阅到您正在测试的可观察对象。在将 TestScheduler 推进所需的时间后,您可以检查是否发生超时,例如 testObserver.Messages.AssertEqual(OnError(timeout))
    • @ket:将ObserveOnTestScheduler 一起使用并没有什么意义。 ObserveOn 有不同的用途,例如如果您 ObserveOn 与 UI 关联的调度程序(如 DispatcherScheduler),则可以确保您可以通过订阅修改应用程序的 UI。 TestScheduler 用于“压缩”时间,应作为参数传递给等待时间通过的操作,如 Timeout
    • 我不认为上述评论是好的建议,或者至少是完整的建议。 ObserveOn 是单元测试类的一部分是很常见的,因此它通常与 TestScheduler 一起使用。但是,这通常会被间接使用,因为ObserveOn 将在被测类中,而TestScheduler 将从测试中注入。在 prod 中,IScheduler 类似于 DispatcherScheduler,但在测试中,您可以将其替换为 TestScheduler
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多