(Esto parece superponerse parcialmente con mi pregunta anterior: probar la interacción con dos funciones asíncronas de intervalo )
Usando jest 27.5.1 y sinon 13.0.1, quiero probar unitariamente una función de intervalo asíncrono.
Considere este código:
const fs = require("fs") const { exec } = require("child_process") module.exports = class MyClass { init() { setInterval(this.checkFileContent, 10) } async checkFileContent() { await new Promise((resolve) => { exec("sleep 0.4", resolve) }) const fileContent = (await fs.promises.readFile("foo.txt")).toString() console.log(fileContent) } }y este archivo de prueba
const MyClass = require(".") const fs = require("fs") const sinon = require("sinon") const { exec } = require("child_process") describe("MyClass", () => { let sandbox beforeAll(async () => { sandbox = sinon.createSandbox() await fs.writeFileSync("foo.txt", "fooContent") }) afterAll(async () => { await fs.unlinkSync("foo.txt") await new Promise((resolve) => { exec("sleep 0.8", resolve) }) sandbox.verifyAndRestore() }) test("should test MyClass", async () => { const clock = sandbox.useFakeTimers() const instance = new MyClass() instance.init() clock.next() await Promise.resolve() // As suggested in this answer https://stackoverflow.com/a/52196951/2710714 - but doesn't seem to help at all clock.reset() }) }) Ejecutando la prueba, siempre obtendré ENOENT: no such file or directory, open 'foo.txt' . El motivo es que await fs.unlinkSync("foo.txt") ya se ejecutó cuando se alcanzó await fs.promises.readFile("foo.txt") .
Por lo tanto, necesito asegurarme de alguna manera de que todas las promesas en la función de interval iniciada por clock.next() se resuelvan antes de que se detengan las pruebas. ¿Cómo puedo hacer eso?
Nota: en la vida real, no se trata de acceso a archivos sino de consultas a bases de datos. Y el exec("sleep ..." es, por supuesto, algo artificial para replicar operaciones de larga duración. Pero los principios deberían ser los mismos.
Editar: también probé await clock.nextAsync() - no ayudó.