你会为Rx.Observable创建一个服务吗?

时间:2011-09-27 06:34:50

标签: mvvm system.reactive

我在VM中有以下代码..

Observable
                    .Timer(remainingTimeSpanForNextHour, TimeSpan.FromHours(1))
                    .Timestamp()
                    .Subscribe( x => FillBookingData());

我的问题是〜

  1. 您认为我们需要测试此代码吗?如果我们计划测试这段代码,我们是否会尝试测试Rx?也许。我们应该只测试这个值“remainingTimeSpanForNextHour”

  2. 假设我们应该测试这段代码。您认为创建像IObservableService这样的服务是个好主意吗?

2 个答案:

答案 0 :(得分:2)

测试代码总是一个好主意,但如果您的代码全部在一个方法或代码块中,那么使用observable可能会有点困难。

您应该尝试将此查询的组件分开 - 对我来说有三个组件:

  1. 参数
  2. 可观察
  3. 观察
  4. 因此,编写测试以确保您获得正确的参数值。

    然后编写测试,确保您的查询根据一组类似的输入值生成值。我不会写一个必须等​​待一个小时才能到达值的测试,所以将小时数改为秒等等。

    然后编写确保观察者工作的测试。

    现在,就编写IObservableService接口/实现而言,我认为这不是一件好事。相反,我会专注于编写一项或多项服务,以便在功能基础上抽象出你想要做的事情,这样你就会干嘛(不要重复自己)。

    所以,我认为ITimerService可能有用。

    public interface ITimerService
    {
        IDisposable Subscribe(TimeSpan dueTime, TimeSpan period, Action action);
    }
    

    显然它被设计为适合Rx - 签名类似于Observable.TimerIObservable.Subscribe交叉。它将使用您现有的查询,只是使用输入参数。

    您应该发现测试此代码非常简单。

    请告诉我这是否适合您。

答案 1 :(得分:1)

使用Virtual Time测试计时器很简单 - 您可以忽略ReactiveUI位,使用AdvanceTo并找出将您正在使用的IScheduler注入代码的方法(Timer()和Timestamp()都必须给你的TestScheduler对象)

即使这看起来很痛苦,但最终结果是您可以测试通常需要时间执行的代码,立即并且您的测试每次都会有相同的结果。