Tengo una función simple que llama a mi servicio s3 que devolverá una Promesa
downloadFile(fileName: string): Promise<Readable> { console.log( "Downloading an object with key - ", fileName ); return this.s3service.getObject(fileName); }Me gustaría burlarme de la devolución del objeto y afirmarlo en la prueba de esta manera:
it("should return readable if file present", async () => { const readable = new Readable(); readable.push("test"); jest .spyOn(s3service, "getObject") .mockImplementation(() => Promise.resolve(readable)); const file = await someService.downloadFile( TestConstants.reportName ); expect(file).toBe(readable); });Cuando ejecuto la prueba, me enfrento a este error:
Error [ERR_METHOD_NOT_IMPLEMENTED]: el método _read() no está implementado en Readable. read (interno/streams/readable.js:642:9) en Readable.read (internal/streams/readable.js:481:10) en mayReadMore (internal/streams/readable.js:629:12) en processTicksAndRejections (interno /process/task_queues.js:82:21) { código: 'ERR_METHOD_NOT_IMPLEMENTED'
Quisiera ayuda sobre cómo puedo simular correctamente un legible, por ejemplo, en este ejemplo
Su código de producción simplemente reenvía la respuesta del servicio al exterior, luego simplemente getObject para devolver cualquier cosa, y espera que el resultado sea getObject result y la función de servicio habrá llamado con el parámetro correcto:
it("should return readable if file present", async () => { const readable = "readable-object" as unknown as Readable; jest.spyOn(s3service, "getObject").mockResolvedValue(readable); const actual = await someService.downloadFile(TestConstants.reportName); expect(actual).toBe(readable); expect(s3service.getObject).toHaveBeenCalledWith(TestConstants.reportName); });