【问题标题】:TestScheduler for subject主题的TestScheduler
【发布时间】:2020-04-27 17:54:59
【问题描述】:

我正在尝试就一个简单的主题 submitTask$ 致电 .next。

我的管道是这样的:

export const submitTask$ = new Subject();

function epic() {
  return submitTask$.pipe(
    map(taskId => {
        console.log('here');
        return Boolean(taskId)
    })
  )
}

我正在尝试使用 TestScheduler 对此进行测试,但无法弄清楚如何进行。我试过这个:

const testScheduler = new TestScheduler((actual, expected) => {
  expect(actual).toStrictEqual(expected);
});

testScheduler.run(({ hot, expectObservable }) => {

const actions$ = hot('-', [() => submitTask$.next(task.id)]);

const output$ = epic();

expectObservable(output$).toBe('0', [true]);

但是它不起作用,我从来没有看到console.log('here')

【问题讨论】:

  • RxJS Subject 是Observable 的一种特殊类型。如果没有订阅Observer,则不会评估它的管道。所以我认为测试中的output$ 需要一个subscribe 方法。 (我还没有使用TestScheduler,这就是为什么我确定它是否会改变默认行为。)这是我在没有TestScheduler 的情况下在stackblitz 上测试的:stackblitz.com/edit/…

标签: rxjs rxjs-test-scheduler


【解决方案1】:

在我看来,您没有订阅actions$。另外,我不确定[() => submitTask$.next(task.id)] 会做什么。

你可以试试这个:


testScheduler.run(({ /* ... */ }) => {
  const s = new Subject();

  const src = hot('    --a', { a: 1 /* task.id */ });
  const expectedSrc = '--1';

  const epicObs = cold('-s').pipe(mergeMapTo(epic())); // Subscribe to the subject, before the value is emitted
  const expectedEpic = '--v';
  const epicValues = { v: true };

  expectObservable(src.pipe(tap(id => s.next(id)))).toBe(expectedSrc);
  expectObservable(epicObs).toBe(expectedEpic, epicValues);
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多