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



我在VM中有以下代码。

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

我的问题是~

  1. 你认为我们需要测试这个代码吗?如果我们计划测试这段代码,会不会像我们在测试Rx一样?也许吧。我们应该只测试这个值"remainingTimeSpanForNextHour"

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

测试你的代码总是一个好主意,但是如果你的代码都在一个方法或代码块中,那么测试可观察对象就有点困难了。

你应该试着把这个查询的组件分开——对我来说有三个组件:

    参数
  1. 观察者

因此,编写测试以确保您得到正确的参数值。

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

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

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

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

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

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

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

请告诉我这对你来说是不是一个好的起点。

使用Virtual Time测试计时器很容易-你可以忽略ReactiveUI位,使用AdvanceTo并找出一种方法将你正在使用的isscheduler注入到你的代码中(timer()和Timestamp()必须给定你的TestScheduler对象)

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

相关内容

  • 没有找到相关文章

最新更新