Я юнит-тестирую rx js с шуткой, и я пришел к ситуации, когда два разных теста внутри их собственного testScheduler.run
, кажется, разделяют общее количество кадров (если не происходит чего-то еще).
Вот мой тест:
import { map } from "rxjs/operators";
import { TestScheduler } from "rxjs/testing";
import { timer, race } from "rxjs";
const testScheduler = new TestScheduler((actual, expected) => {
expect(actual).toEqual(expected);
});
describe("Testing race conditions", () => {
it("obs1 should complete first", () => {
testScheduler.run(helpers => {
const { cold, expectObservable } = helpers;
const obs1$ = cold("--a");
const obs2$ = timer(5000).pipe(map(x => x.toString()));
const output$ = race(obs1$, obs2$);
const expected = "--a";
expectObservable(output$).toBe(expected);
});
});
it("obs2 should complete first", () => {
testScheduler.run(helpers => {
const { cold, expectObservable } = helpers;
const obs1$ = cold("5m --a");
const obs2$ = timer(5000).pipe(map(x => x.toString()));
const output$ = race(obs1$, obs2$);
const expected = "5s (0|)";
expectObservable(output$).toBe(expected);
});
});
});
И вот результаты:
Если я удалю первый тест, второй проходит, и если я их инвертирую, второй проходит, а первый терпит неудачу со следующими результатами:
Обратите внимание, как в первом случае 2 кадра из первого успешного теста добавляются к 5 секундам, истекшим во втором, в результате получается 5002 и не выполняется из-за этих 2 дополнительных кадров. Во втором случае 5 секунд снова накапливаются в сумме 5002, в отличие от ожидаемых 2.
Я наконец решил это, сделав локальные объявления testScheduler
внутри функции it
, что тоже кажется мне странным, потому что в документах оно объявлено снаружи, например:
import { TestScheduler } from 'rxjs/testing';
const testScheduler = new TestScheduler((actual, expected) => {
// asserting the two objects are equal
// e.g. using chai.
expect(actual).deep.equal(expected);
});
// This test will actually run *synchronously*
it('generate the stream correctly', () => {
testScheduler.run(helpers => {
const { cold, expectObservable, expectSubscriptions } = helpers;
const e1 = cold('-a--b--c---|');
const subs = '^----------!';
const expected = '-a-----c---|';
expectObservable(e1.pipe(throttleTime(3, testScheduler))).toBe(expected);
expectSubscriptions(e1.subscriptions).toBe(subs);
});
});
Итак, я хотел знать, является ли такое поведение нормальным или преднамеренным? Или мне чего-то не хватает?