我在VM中有以下代码。
Observable
.Timer(remainingTimeSpanForNextHour, TimeSpan.FromHours(1))
.Timestamp()
.Subscribe( x => FillBookingData());
我的问题是~
你认为我们需要测试这个代码吗?如果我们计划测试这段代码,会不会像我们在测试Rx一样?也许吧。我们应该只测试这个值"remainingTimeSpanForNextHour"
假设我们应该测试这段代码。你认为创建IObservableService这样的服务是个好主意吗?
测试你的代码总是一个好主意,但是如果你的代码都在一个方法或代码块中,那么测试可观察对象就有点困难了。
你应该试着把这个查询的组件分开——对我来说有三个组件:
- 参数
- 的 观察者
因此,编写测试以确保您得到正确的参数值。
然后编写测试,确保查询根据一组相似的输入值生成值。我不会编写一个必须等待一个小时的值到达的测试,所以将小时更改为秒,等等。
然后编写测试以确保观察者工作。
现在,就编写IObservableService
接口/实现而言,我认为这不是一件好事。相反,我会专注于编写一个或多个服务,这些服务抽象出你在功能基础上试图做的事情,这样你就做到了DRY(不要重复自己)。
所以,我认为ITimerService
可能是有用的。
public interface ITimerService
{
IDisposable Subscribe(TimeSpan dueTime, TimeSpan period, Action action);
}
显然,它被设计成适合于Rx -签名类似于Observable.Timer
与IObservable.Subscribe
交叉。它将使用您现有的查询,只是使用输入参数。
您应该会发现测试这段代码非常容易。
使用Virtual Time测试计时器很容易-你可以忽略ReactiveUI位,使用AdvanceTo并找出一种方法将你正在使用的isscheduler注入到你的代码中(timer()和Timestamp()必须给定你的TestScheduler对象)
尽管这看起来很痛苦,但最终的结果是您可以测试通常需要时间来执行的代码,立即并且您的测试每次都会得到相同的结果。