Тестирование функции, которая многократно вызывает setImmediate

#node.js #typescript #jestjs

Вопрос:

У меня есть читаемый поток, который использует вызов setImmediate для передачи данных:

 type Source = Readable amp; { data: string[] }

const source: Source = new Readable()
source.data = ['A', 'B', 'C'];
source._read = (function sourceRead(this: Source, _: number): void {
  setImmediate(() => {
    let value = this.data.shift()
    if (value === undefined) value = null
    this.push(value)
  })
}).bind(source)
 

Я использую jest для тестирования этого потока:

 import {
  afterEach,
  beforeEach,
  describe,
  expect,
  it,
  jest
} from '@jest/globals'
import { PassThrough } from 'stream'

async function streamToArray(sink: Duplex): Promise<string[]> {
  const arr: string[] = []

  for await (const chunk of sink) {
    const str = (chunk as Uint8Array | Buffer).toString('ascii')
    arr.push(str)
  }

  return arr;
}

describe('Spigot', () => {
  beforeEach(() => {
    jest.useFakeTimers('modern')
  })

  afterEach(() => {
    jest.useRealTimers()
  })

  it('passes data to the consumer', async () => {
     const sink = new PassThrough()
     // assume source Readable stream is created here
     source.pipe(sink)
     jest.runAllTimers()
     const data = await streamToArray(sink)
     expect(data).toEqual(['A', 'B', 'C'])
  })

 

Я нахожу, что тест проходит неопределенно долго, пока не истечет время шуток. Как я могу издеваться над setImmediate для синхронного запуска перед вызовом streamToArray .