Virtual time scheduler used for testing applications and libraries built using Reactive Extensions. This inherits from the Rx.VirtualTimeScheduler
class.
The following shows an example of using the Rx.TestScheduler
. In order to make the end comparisons work, you must implement a collection assert, for example here using QUnit.
function createMessage(expected, actual) {
return 'Expected: [' + expected.toString() + ']\r\nActual: [' + actual.toString() + ']';
}
// Using QUnit testing for assertions
var collectionAssert = {
assertEqual: function (actual, expected) {
var comparer = Rx.internals.isEqual, isOk = true;
if (expected.length !== actual.length) {
ok(false, 'Not equal length. Expected: ' + expected.length + ' Actual: ' + actual.length);
return;
}
for(var i = 0, len = expected.length; i < len; i++) {
isOk = comparer(expected[i], actual[i]);
if (!isOk) {
break;
}
}
ok(isOk, createMessage(expected, actual));
}
};
var onNext = Rx.ReactiveTest.onNext,
onCompleted = Rx.ReactiveTest.onCompleted,
subscribe = Rx.ReactiveTest.subscribe;
var scheduler = new Rx.TestScheduler();
// Create hot observable which will start firing
var xs = scheduler.createHotObservable(
onNext(150, 1),
onNext(210, 2),
onNext(220, 3),
onCompleted(230)
);
// Note we'll start at 200 for subscribe, hence missing the 150 mark
var res = scheduler.startScheduler(function () {
return xs.map(function (x) { return x * x });
});
// Implement collection assertion
collectionAssert.assertEqual(res.messages, [
onNext(210, 4),
onNext(220, 9),
onCompleted(230)
]);
// Check for subscribe/unsubscribe
collectionAssert.assertEqual(xs.subscriptions, [
subscribe(200, 230)
]);
- rx.testing.js
createColdObservable
createHotObservable
createObserver
createRejectedPromise
createResolvedPromise
startScheduler
Creates a new virtual time test scheduler.
var onNext = Rx.ReactiveTest.onNext,
onCompleted = Rx.ReactiveTest.onCompleted,
subscribe = Rx.ReactiveTest.subscribe;
var scheduler = new Rx.TestScheduler();
// Create hot observable which will start firing
var xs = scheduler.createHotObservable(
onNext(150, 1),
onNext(210, 2),
onNext(220, 3),
onCompleted(230)
);
// Note we'll start at 200 for subscribe, hence missing the 150 mark
var res = scheduler.startScheduler(function () {
return xs.map(function (x) { return x * x });
});
// Implement collection assertion
collectionAssert.assertEqual(res.messages, [
onNext(210, 4),
onNext(220, 9),
onCompleted(230)
]);
// Check for subscribe/unsubscribe
collectionAssert.assertEqual(xs.subscriptions, [
subscribe(200, 230)
]);
File:
Dist:
Prerequisites:
NPM Packages:
NuGet Packages:
Creates a cold observable using the specified timestamped notification messages.
args
(Arguments): An arguments array of Recorded objects fromRx.ReactiveTest.onNext
,Rx.ReactiveTest.onError
, andRx.ReactiveTest.onCompleted
methods.
(Observable): Cold observable sequence that can be used to assert the timing of subscriptions and notifications.
var onNext = Rx.ReactiveTest.onNext,
onCompleted = Rx.ReactiveTest.onCompleted
subscribe = Rx.ReactiveTest.subscribe;
var scheduler = new Rx.TestScheduler();
// Create cold observable with offset from subscribe time
var xs = scheduler.createColdObservable(
onNext(150, 1),
onNext(200, 2),
onNext(250, 3),
onCompleted(300)
);
// Note we'll start at 200 for subscribe
var res = scheduler.startScheduler(function () {
return xs.filter(function (x) { return x % 2 === 0; });
});
// Implement collection assertion
collectionAssert.assertEqual(res.messages, [
onNext(400, 2),
onCompleted(500)
]);
// Check for subscribe/unsubscribe
collectionAssert.assertEqual(xs.subscriptions, [
subscribe(200, 500)
]);
File:
Dist:
Prerequisites:
NPM Packages:
NuGet Packages:
Creates a hot observable using the specified timestamped notification messages.
args
(Arguments): An arguments array of Recorded objects fromRx.ReactiveTest.onNext
,Rx.ReactiveTest.onError
, andRx.ReactiveTest.onCompleted
methods.
(Observable): Hot observable sequence that can be used to assert the timing of subscriptions and notifications.
var onNext = Rx.ReactiveTest.onNext,
onCompleted = Rx.ReactiveTest.onCompleted;
var scheduler = new Rx.TestScheduler();
// Create hot observable which will start firing
var xs = scheduler.createHotObservable(
onNext(150, 1),
onNext(210, 2),
onNext(220, 3),
onCompleted(230)
);
// Note we'll start at 200 for subscribe, hence missing the 150 mark
var res = scheduler.startScheduler(function () {
return xs.map(function (x) { return x * x });
});
// Implement collection assertion
collectionAssert.assertEqual(res.messages, [
onNext(210, 4),
onNext(220, 9),
onCompleted(230)
]);
// Check for subscribe/unsubscribe
collectionAssert.assertEqual(xs.subscriptions, [
subscribe(200, 230)
]);
File:
Dist:
Prerequisites:
NPM Packages:
NuGet Packages:
Creates an observer that records received notification messages and timestamps those.
Observer
: Observer that can be used to assert the timing of received notifications.
var onNext = Rx.ReactiveTest.onNext;
var scheduler = new Rx.TestScheduler();
var d = new Rx.SerialDisposable();
var xs = Rx.Observable.return(42, scheduler);
var res = scheduler.createObserver();
scheduler.scheduleAbsolute(null, 100, function () {
return d.setDisposable(xs.subscribe(
function (x) {
d.dispose();
res.onNext(x);
},
res.onError.bind(res),
res.onCompleted.bind(res)
));
});
scheduler.start();
collectionAssert.assertEqual(res.messages, [
onNext(101, 42)
]);
File:
Dist:
Prerequisites:
NPM Packages:
NuGet Packages:
Creates a rejected promise with the given reason and ticks.
ticks
(Number): The absolute time of the resolution.reason
(Any): The reason for rejection to yield at the given tick.
(Promise): A mock Promise which rejects with the given reason.
var onNext = Rx.ReactiveTest.onNext,
onError = Rx.ReactiveTest.onError,
onCompleted = Rx.ReactiveTest.onCompleted;
var scheduler = new Rx.TestScheduler();
// Create rejected promise
var error = new Error();
var xs = scheduler.createRejectedPromise(201, error);
// Note we'll start at 200 for subscribe, hence missing the 150 mark
var res = scheduler.startScheduler(function () {
// Need to pass test scheduler due to issue #976
return Rx.Observable.fromPromise(xs, scheduler);
});
// Implement collection assertion
collectionAssert.assertEqual(res.messages, [
onError(201, error)
]);
File:
Dist:
Prerequisites:
NPM Packages:
NuGet Packages:
Creates a resolved promise with the given value and ticks.
ticks
(Number): The absolute time of the resolution.value
(Any): The value to yield at the given tick.
(Promise): A mock Promise which fulfills with the given value.
var onNext = Rx.ReactiveTest.onNext,
onError = Rx.ReactiveTest.onError,
onCompleted = Rx.ReactiveTest.onCompleted;
var scheduler = new Rx.TestScheduler();
// Create resolved promise
var xs = scheduler.createResolvedPromise(201, 1);
// Note we'll start at 200 for subscribe, hence missing the 150 mark
var res = scheduler.startScheduler(function () {
// Need to pass test scheduler due to issue #976
return Rx.Observable.fromPromise(xs, scheduler);
});
// Implement collection assertion
collectionAssert.assertEqual(res.messages, [
onNext(201, 1),
onCompleted(201)
]);
File:
Dist:
Prerequisites:
NPM Packages:
NuGet Packages:
Starts the test scheduler and uses the specified settings for creation, subscription and disposal. If not specified, they will be set to their default timings.
create
:Function
- Factory method to create an observable sequence.settings
:Object
- An object with the following properties:created
:Number
- the time to create the Observable sequence. If not specified, will default to 100.subscribed
:Number
- the time to subscribe to the Observable sequence. If not specified, will default to 200.disposed
:Number
- the time to dispose the Observable sequence. If not specified, will default to 1000.
Observer
: Observer with timestamped recordings of notification messages that were received during the virtual time window when the subscription to the source sequence was active.
var onNext = Rx.ReactiveTest.onNext,
onCompleted = Rx.ReactiveTest.onCompleted;
var scheduler = new Rx.TestScheduler();
// Create cold observable with offset from subscribe time
var xs = scheduler.createColdObservable(
onNext(150, 1),
onNext(200, 2),
onNext(250, 3),
onCompleted(300)
);
// Note we'll start at 200 for subscribe
var res = scheduler.startScheduler(function () {
return xs.filter(function (x) { return x % 2 === 0; });
});
// Implement collection assertion
collectionAssert.assertEqual(res.messages, [
onNext(400, 2),
onCompleted(500)
]);
// Check for subscribe/unsubscribe
collectionAssert.assertEqual(xs.subscriptions, [
subscribe(200, 500)
]);
File:
Dist:
Prerequisites:
NPM Packages:
NuGet Packages: