#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
.