Unit testing 如何对使用定时器的Rx操作员进行单元测试?

Unit testing 如何对使用定时器的Rx操作员进行单元测试?,unit-testing,system.reactive,Unit Testing,System.reactive,有很多基于计时器的操作符,虽然我没有具体的例子,但我认为创建使用计时器的新操作符是很常见的。那么,您将如何编写一个为这些操作符同步运行的测试呢 例如,如何对BufferWithTime之类的运算符进行单元测试?最容易进行测试的方法是使用TestScheduler: var source=新主题(); var scheduler=newtestscheduler(); var outputValues=新列表(); 来源 .BufferWithTime(TimeSpan.FromTicks(500

有很多基于计时器的操作符,虽然我没有具体的例子,但我认为创建使用计时器的新操作符是很常见的。那么,您将如何编写一个为这些操作符同步运行的测试呢


例如,如何对BufferWithTime之类的运算符进行单元测试?

最容易进行测试的方法是使用
TestScheduler

var source=新主题();
var scheduler=newtestscheduler();
var outputValues=新列表();
来源
.BufferWithTime(TimeSpan.FromTicks(500),调度程序)
.Subscribe(x=>outputValues.Add(x));
RunTo(1);
资料来源.OnNext(1);
RunTo(100);
资料来源:OnNext(2);
RunTo(200);
资料来源:OnNext(3);
RunTo(501);
资料来源:OnNext(4);
RunTo(1001);
arenequal(2,outputValues.Count);
Assert.AreEqual(3,outputValues[0].Count);
Assert.AreEqual(1,outputValues[1].Count);
此外,您还可以使用
System.Reactive.Testing.dll
中的一系列类型,这使事情变得更加简单,但依赖于
Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll
,后者反过来又依赖于
System.Web.dll
(在客户端配置文件中不可用)

//使用System.Reactive.Testing;
//使用系统、反应、测试、模拟;
var scheduler=newtestscheduler();
var source=scheduler.CreateColdObservable(
新记录(0,新通知.OnNext(1)),
新记录(100,新通知.OnNext(2)),
新记录(400,新通知.OnNext(3)),
新记录(500,新通知。OnNext(4))
)
.BufferWithTime(TimeSpan.FromTicks(500),调度程序);
var-observer=新的MockObserver(调度器);
来源:订阅(观察员);
RunTo(1001);
Assert.AreEqual(2,observer.Count);
Assert.AreEqual(3,观察者[0].Value.Value.Count);
Assert.AreEqual(1,观察者[1].Value.Value.Count);

要在使用System.Responsive.Testing时获得测试的良好可读性,请使用您自己的测试助手类,如下所述: