Me estoy burlando de una función:
jest.mock('utils/downloadData')En utils/datos de descarga, creé un archivo simulado:
export default { general: jest.fn(() => { console.log('mock fired') }), csv: jest.fn(() => { console.log('mock fired') }), }Esta función se llama dentro de una función que estoy probando:
... const convertToCsv = () => { downloadData.csv(CSV.stringify(csvData), fileName) onFinish() } ...Al depurar veo que la función simulada está correctamente configurada en el cierre, al depurar paso a paso veo que el código llega dentro de la función simulada y esa consola registra el mensaje. Sin embargo, esta prueba falla:
expect(downloadData.csv).toBeCalledTimes(1) Jest acepta downloadData.csv dentro de lo esperado, así que creo que ve la función simulada.
¿Cómo es posible que no lo registre como llamado?
La función probada implicaba una obtención de datos asíncrona, que también se burló. Pero la naturaleza asíncrona de eso hizo que la prueba evaluara los valores esperados antes de que terminara de ejecutar la función probada.
Lo que ayudó no fue solo hacer que la función de prueba fuera asíncrona ( test('output', async() => { ) sino también incluir esta línea encima de la evaluación: await new Promise(process.nextTick) Esto permite que la prueba finalice los bits asíncronos antes de evaluar los resultados.