我如何使用带有承诺和延迟的 TestScheduler?
How can I use the TestScheduler with promises and delays?
我正在努力让 Jasmine、promises 和 Rx.TestScheduler 一起玩得很好,但我 运行 遇到了一个我似乎无法解决的障碍。
我想要实现的是使用 RxJs 和 Jasmine 测试延迟承诺。
我在这里 JsFiddle 中创建了问题的最小再现:https://jsfiddle.net/t9gsymu2/2/
这是 fiddle 的完整 javascript 代码:
'use strict';
// fail if a test takes longer than 1 second
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
describe('TestScheduler', function () {
it('should work when combining the testscheduler and delay', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return Rx.Observable.just({
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
it('should work when combining the testscheduler, delay AND a promise', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return Promise.resolve({
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
});
两个测试都与 T 相同,唯一的区别是第一个测试使用 Rx.Observable.just
而第二个测试使用 Promise.resolve
。
(我可以使用 Rx.Observable.fromPromise
来确保实际创建了一个 Observable,但是 1.我已经试过了 2. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/promises.md 的文档明确指出 flatMap 支持 Promise 对象)
第一个测试立即成功。 Observable 使用可以模拟时间的 Rx.TestScheduler 延迟 2 秒。 scheduler.start()
方法立即执行任何计划任务,而不是等待 2 秒。 Jasmine 支持在你的测试中使用 "done" 参数的异步测试,这实际上只是一个你认为测试完成时需要调用的函数。
然而,第二次测试失败了。我假设这与 Promises 是异步的有关,这导致 TestScheduler 无法接受那些回调中发生的任何事情。
如有任何帮助,我们将不胜感激!
我最近很火,这是我在SO上发布问题后不久就找到答案的第二次。
无论如何,解决方案是使用 RxJs 库中内置的 MockPromise。
所以不要使用 Promise.resolve(true)
,而是使用 scheduler.createResolvedPromise(100, true)
。
这是工作 fiddle:https://jsfiddle.net/t9gsymu2/4/
完整代码:
'use strict';
// fail if a test takes longer than 1 second
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
describe('TestScheduler', function () {
it('should work when combining the testscheduler and delay', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return Rx.Observable.just({
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
it('should work when combining the testscheduler, delay AND a promise', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return scheduler.createResolvedPromise(100, {
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
});
我正在努力让 Jasmine、promises 和 Rx.TestScheduler 一起玩得很好,但我 运行 遇到了一个我似乎无法解决的障碍。
我想要实现的是使用 RxJs 和 Jasmine 测试延迟承诺。
我在这里 JsFiddle 中创建了问题的最小再现:https://jsfiddle.net/t9gsymu2/2/
这是 fiddle 的完整 javascript 代码:
'use strict';
// fail if a test takes longer than 1 second
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
describe('TestScheduler', function () {
it('should work when combining the testscheduler and delay', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return Rx.Observable.just({
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
it('should work when combining the testscheduler, delay AND a promise', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return Promise.resolve({
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
});
两个测试都与 T 相同,唯一的区别是第一个测试使用 Rx.Observable.just
而第二个测试使用 Promise.resolve
。
(我可以使用 Rx.Observable.fromPromise
来确保实际创建了一个 Observable,但是 1.我已经试过了 2. https://github.com/Reactive-Extensions/RxJS/blob/master/doc/gettingstarted/promises.md 的文档明确指出 flatMap 支持 Promise 对象)
第一个测试立即成功。 Observable 使用可以模拟时间的 Rx.TestScheduler 延迟 2 秒。 scheduler.start()
方法立即执行任何计划任务,而不是等待 2 秒。 Jasmine 支持在你的测试中使用 "done" 参数的异步测试,这实际上只是一个你认为测试完成时需要调用的函数。
然而,第二次测试失败了。我假设这与 Promises 是异步的有关,这导致 TestScheduler 无法接受那些回调中发生的任何事情。
如有任何帮助,我们将不胜感激!
我最近很火,这是我在SO上发布问题后不久就找到答案的第二次。
无论如何,解决方案是使用 RxJs 库中内置的 MockPromise。
所以不要使用 Promise.resolve(true)
,而是使用 scheduler.createResolvedPromise(100, true)
。
这是工作 fiddle:https://jsfiddle.net/t9gsymu2/4/
完整代码:
'use strict';
// fail if a test takes longer than 1 second
jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000;
describe('TestScheduler', function () {
it('should work when combining the testscheduler and delay', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return Rx.Observable.just({
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
it('should work when combining the testscheduler, delay AND a promise', function (done) {
var scheduler = new Rx.TestScheduler();
var people = Rx.Observable.just({
name: 'Jeff'
});
var peopleWithTheirAge = people.flatMap(function (person) {
return scheduler.createResolvedPromise(100, {
name: 'Jeff',
age: 25
});
});
var delayedPeopleWithTheirAge = peopleWithTheirAge.delay(2000, scheduler);
delayedPeopleWithTheirAge.subscribe(function (person) {
expect(person).toEqual({
name: 'Jeff',
age: 25
});
done();
});
scheduler.start();
});
});