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

Mvvm 你会为Rx.Observable创建一个服务吗?,mvvm,system.reactive,Mvvm,System.reactive,我在VM中有以下代码 Observable .Timer(remainingTimeSpanForNextHour, TimeSpan.FromHours(1)) .Timestamp() .Subscribe( x => FillBookingData()); 我的问题是~ 你认为我们需要测试这个代码吗?如果我们计划测试此代码,是否会像我们正在尝试测试Rx一样?大概我

我在VM中有以下代码

Observable
                    .Timer(remainingTimeSpanForNextHour, TimeSpan.FromHours(1))
                    .Timestamp()
                    .Subscribe( x => FillBookingData());
我的问题是~

  • 你认为我们需要测试这个代码吗?如果我们计划测试此代码,是否会像我们正在尝试测试Rx一样?大概我们应该只测试这个值“remainingTimeSpanForNextHour”

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


  • 测试代码总是一个好主意,但是如果您的代码都在一个方法或代码块中,那么使用可观察性可能会有点困难

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

  • 参数
  • 可观察
  • 观察者
  • 因此,编写测试以确保获得正确的参数值

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

    然后编写测试以确保观察者正常工作

    现在,就编写
    IObservableService
    接口/实现而言,我认为这不是一件好事。相反,我会专注于编写一个或多个服务,在功能的基础上抽象出您正试图做的事情,这样您就变得枯燥无味了(不要重复自己)

    因此,我认为
    ITimerService
    可能会有用

    public interface ITimerService
    {
        IDisposable Subscribe(TimeSpan dueTime, TimeSpan period, Action action);
    }
    
    显然,它是为配合Rx而设计的-签名类似于
    可观察。计时器
    IObservable交叉。订阅
    。它将使用您现有的查询,只是为了使用输入参数

    您应该发现测试这段代码非常容易


    让我知道这是否是您的一个良好起点。

    测试代码始终是一个好主意,但如果您的代码都在一个方法或代码块中,使用可观察性可能会有点困难

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

  • 参数
  • 可观察
  • 观察者
  • 因此,编写测试以确保获得正确的参数值

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

    然后编写测试以确保观察者正常工作

    现在,就编写
    IObservableService
    接口/实现而言,我认为这不是一件好事。相反,我会专注于编写一个或多个服务,在功能的基础上抽象出您正试图做的事情,这样您就变得枯燥无味了(不要重复自己)

    因此,我认为
    ITimerService
    可能会有用

    public interface ITimerService
    {
        IDisposable Subscribe(TimeSpan dueTime, TimeSpan period, Action action);
    }
    
    显然,它是为配合Rx而设计的-签名类似于
    可观察。计时器
    IObservable交叉。订阅
    。它将使用您现有的查询,只是为了使用输入参数

    您应该发现测试这段代码非常容易


    让我知道这对您来说是否是一个好的起点。

    测试计时器很容易使用-您可以忽略反应UI位,使用AdvanceTo并找到一种方法将您正在使用的ISScheduler注入代码中(必须为您的TestScheduler对象提供timer()和Timestamp()


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

    测试计时器很容易使用-您可以忽略反应UI位,使用AdvanceTo并找到一种方法将您正在使用的ISScheduler注入到代码中(必须为您的TestScheduler对象提供Timer()和Timestamp())

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