tengo
abc.js
const a = (a)=>{ return (b(a) + 1) } const b = (num)=>{ return(num + 1) } module.exports = { a, b }Cuando realicé mi prueba para la función a, quería una implementación simulada de la función b. pero la función a, después de burlarse, todavía ha estado usando la implementación original en lugar de mi simulacro.
mi prueba se ve algo como
abs.prueba.js
const { a } = require('./abc') describe('/abc functions',()=>{ beforeEach(()=>{ jest.mock('./abc',()=>( b = jest.fn.mockReturnValue(5) )) }) afterEach(()=>{ jest.clearAllMocks() }) it('uses the b() mock',()=>{ const aResult = a(1) expect(aResult).toBe(6) }) })pero obtengo un resultado de 2 o cualquiera que sea la implementación original. Solo quería que mi función a usara mi simulacro y nunca lo hace. siempre vuelve a la implementación original.
Probé jest.isolate() para aislar la función que estoy probando. Probé diferentes formas de burlarme como jest.fn(), jest.spyOn y el método sobre jest.requireActual(moduleName)
Probé b = jest.fn().mockImplementation(()=>{})
Estoy confundido en cuanto a por qué la función a, incluso después del aislamiento, todavía se basa en la implementación original de la función b...
¡gracias de antemano!
Debe recordar las reglas del alcance léxico y cómo se relaciona con el concepto de cierres. La respuesta corta sería que la razón por la que su prueba no funciona es porque en su módulo abc.js su función a() llama dentro de su cuerpo a la función b() que ha sido declarada en ese mismo módulo. El entorno donde se definió la función y NO aquel donde se llama es lo que se denomina alcance léxico. Esta combinación del cuerpo de una función que hace uso de los enlaces donde se definió y la llamada de esa función en el contexto de esos enlaces/entorno existentes es lo que se llama un cierre. Entonces, no importa si te burlas de una función b() y tratas de usar esa simulación para alterar el valor de retorno de a() , a() siempre usará la función original b() porque esas son las reglas de dictado de alcance léxico
Diferentes enfoques para resolver el problema. una de ellas es "modularizar" aún más estas funciones dividiéndolas en sus propios módulos. más información sobre este hilo: github.com/facebook/jest/issues/936#issuecomment-545080082