Estoy intentando simular la clase Uppy del paquete uppy en una prueba de unidad Jest siguiendo la guía de esta pregunta respondida anteriormente . Mi código fallido está a continuación:
import Uppy from '@uppy/core'; describe('MyComponent', () => { it('renders', () => { jest.mock('@uppy/core', () => { return { Uppy: jest.fn().mockImplementation(() => { return {}; }), }; }); new Uppy(); expect(Uppy).toHaveBeenCalledTimes(1); }); });La prueba falla con el siguiente mensaje de error:
Matcher error: received value must be a mock or spy function Received has type: function Received has value: [Function Uppy] Parece que la exportación predeterminada de @uppy/core es la clase Uppy , por lo que mi expectativa es que el código proporcionado se burlará del constructor de la clase, sin embargo, este no parece ser el caso.
Versiones del paquete:
Creo que el problema es que estás usando jest.mock() en el momento equivocado. En otras palabras, creo que es demasiado tarde para llamar a jest.mock() dentro de un caso de prueba porque el paquete ya se ha importado en ese momento.
No estoy seguro de cuál es la forma canónica de hacer esto, pero así es como lo hace React:
jest.mock()globalSetup de Jest; como puede ver, esta opción está en el archivo config.base.js : module.exports = { globalSetup: require.resolve('./setupGlobal.js'), }cuando se ejecuta el script de prueba, elegirá la configuración en función de los argumentos proporcionados
un ejemplo de dicha configuración sería este archivo que, como puede ver, extiende config.base , que es donde se ha configurado la opción globalSetup
/* ... */ const baseConfig = require('./config.base'); module.exports = Object.assign({}, baseConfig, { /* ... */ }); /* ... */ Entonces, diría que hacer uso de esa opción globalSetup debería resolver el problema.