El siguiente código funciona como se esperaba al probarlo manualmente en la consola del navegador. Recibo el número correcto de puntos con un retraso de un segundo en la consola.
const defer = (func, ms) => { return function() { setTimeout(() => func.call(this, ...arguments), ms); }; }; const playerPerformance = { goals: 33, assists: 21, points(penaltiesEarned) { console.log((this.goals * 2) + (this.assists * 1.5) + (penaltiesEarned * 1.5)); }, }; const deferredPointsDisplay = defer(playerPerformance.points, 1000); deferredPointsDisplay.call( { goals: 18, assists: 19 }, 7 ); // in 1 sec: 75Sin embargo, me cuesta escribir una prueba de unidad efectiva en index.test.js (otras pruebas se ejecutan perfectamente, por lo que las configuraciones de babel y jest están bien). Busqué en Google la idea de async y esperé, sin embargo, los ejemplos que encontré en la web no me ayudaron a entender cómo aplicar esto correctamente a mi código. La siguiente prueba falla:
it('should return 75', () => { const playerPerformance = { goals: 33, assists: 21, points(penaltiesEarned) { console.log((this.goals * 2) + (this.assists * 1.5) + (penaltiesEarned * 1.5)); }, }; const consoleSpy = jest.spyOn(console, 'log'); const deferredPointsDisplay = defer2(playerPerformance.points, 1000); deferredPointsDisplay.call( { goals: 18, assists: 19 }, 7); expect(consoleSpy).toHaveBeenCalledWith(75); });Le agradecería que me ayudara a entender cómo puedo evitar que setTimeout() falle en mi prueba unitaria.
Puede burlarse de setTimeout y puede espiar console.log . No necesita usar async / await aquí, su función defer() no usa promesas.