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