unit-testing - 您如何对使用计时器的 Rx 运算符进行单元测试?

标签 unit-testing system.reactive

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

例如,我如何对 BufferWithTime 等运算符进行单元测试?

最佳答案

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

var source = new Subject<int>();
var scheduler = new TestScheduler();

var outputValues = new List<IList<int>>();

source
    .BufferWithTime(TimeSpan.FromTicks(500), scheduler)
    .Subscribe(x => outputValues.Add(x));

scheduler.RunTo(1);
source.OnNext(1);

scheduler.RunTo(100);
source.OnNext(2);

scheduler.RunTo(200);
source.OnNext(3);

scheduler.RunTo(501);
source.OnNext(4);

scheduler.RunTo(1001);

Assert.AreEqual(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 (在客户资料中不可用)。

// using System.Reactive.Testing;
// using System.Reactive.Testing.Mocks;

var scheduler = new TestScheduler();

var source = scheduler.CreateColdObservable(
    new Recorded<Notification<int>>(0, new Notification<int>.OnNext(1)),
    new Recorded<Notification<int>>(100, new Notification<int>.OnNext(2)),
    new Recorded<Notification<int>>(400, new Notification<int>.OnNext(3)),
    new Recorded<Notification<int>>(500, new Notification<int>.OnNext(4))
    )
    .BufferWithTime(TimeSpan.FromTicks(500), scheduler);

var observer = new MockObserver<IList<int>>(scheduler);

source.Subscribe(observer);

scheduler.RunTo(1001);

Assert.AreEqual(2, observer.Count);
Assert.AreEqual(3, observer[0].Value.Value.Count);
Assert.AreEqual(1, observer[1].Value.Value.Count);

关于unit-testing - 您如何对使用计时器的 Rx 运算符进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5246133/

相关文章:

swift - swift中的Quick框架中的describe和context有什么区别?

c# - 模拟傻瓜?

c# - IQbservable 示例

c# - SubscribeOn() 在这里做什么?

c# - 使用 System.Reactive 观察 ObservableCollection 中项目的 PropertyChanged

rx-java - 响应式(Reactive)扩展仅适用于返回集合的 API 调用吗?

javascript - catch 和 onErrorResumeNext 的区别

java - Mockito 通过泛型类型的构造函数参数反射创建模拟

java - 如何使用 EasyMock 对我想要模拟的类进行多个内部调用来对方法进行单元测试

java - Gradle 找不到 JUnit 测试