Как вы тестируете Rx-операторы, которые используют таймеры? - PullRequest
6 голосов
/ 09 марта 2011

Есть ряд операторов, которые основаны на таймере, и я, хотя у меня нет конкретного примера, подумал бы, что принято создавать новые операторы, которые используют таймеры.Итак, как бы вы написали тест, который выполняется синхронно для этих операторов?

В качестве примера, как можно провести модульное тестирование оператора, такого как BufferWithTime?

1 Ответ

8 голосов
/ 09 марта 2011

Самый доступный способ сделать это - использовать 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);
...