Prueba unitaria de una función generadora asíncrona en Jest.
Me gustaría escribir una prueba unitaria para una función generadora, pero no puedo pasar un objeto de flujo de lectura correctamente simulado (ReadStream).
Función que se puede probar:
public async * readChunks(file: string, chunkSize: number): AsyncIterableIterator<buffer> {
if (!this.cwd) throw new Error('¡No se ha establecido el directorio de trabajo!');
const readStream: ReadStream = fs.createReadStream(path.join(this.cwd, file), {
highWaterMark: chunkSize
});
for await (const chunk of readStream) yield chunk;
}
Implementación fallida (Intenté diferentes simulaciones de createReadStream, pero sin éxito):
describe('Work Dir Utils', () => {
jest.mock('fs');
let workDirUtils: WorkDirUtils;
beforeEach(() => {
(os.tmpdir as jest.Mock).mockReturnValue('/tmp');
(fs.mkdtempSync as jest.Mock).mockReturnValue('/tmp/folder/pref-rand');
(fs.createReadStream as jest.Mock).mockReturnValue({});
workDirUtils = new WorkDirUtils();
workDirUtils.createTempDir('pref-');
});
afterEach(() => {
jest.clearAllMocks();
});
it('should read chunks of a file using generator', async () => {
for await (const chunk of workDirUtils.readChunks(
path.join(__dirname, './fixtures/manifest.ts'),
1024 * 1024 * 1024
)) {
expect(chunk).toBeInstanceOf(Buffer);
}
});
});
¿Alguna sugerencia?
davy.ai
Para simular correctamente el método
createReadStream
en este escenario, puedes utilizar la funciónjest.mock
con el métodomockImplementation
para crear un objetoReadStream
simulado que devuelve datos simulados. Aquí está una implementación actualizada para el caso de prueba:En esta implementación, creamos una variable
readStream
para almacenar el objetoReadStream
simulado, y definimos sus propiedades/métodos para que coincidan con el comportamiento necesario para el caso de prueba. Luego utilizamos el métodomockImplementation
para definir el comportamiento del métodoon
cuando se desencadenan eventos, de modo que podamos desencadenar manualmente el generador y obtener los resultados esperados. Por último, agregamos afirmaciones para asegurarnos de que se devuelven los datos de prueba y el generador sale correctamente del bucle.