Solo quiero simular una sola función (llamada exportación) de un módulo, pero dejar intactas el resto de las funciones del módulo.
Usar jest.mock('package-name') hace que todas las funciones exportadas se simulan, lo cual no quiero.
Intenté distribuir las exportaciones nombradas de nuevo en el objeto simulado...
import * as utils from './utilities.js'; jest.mock(utils, () => ({ ...utils speak: jest.fn(), }));pero obtuve este error:
La fábrica de módulos de
jest.mock()no puede hacer referencia a ninguna variable fuera del alcance.
Lo más destacado de esta respuesta es jest.requireActual() , esta es una utilidad muy útil que dice en broma que "Oye, mantén intactas todas las funcionalidades originales e impórtalas".
jest.mock('./utilities.js', () => ({ ...jest.requireActual('./utilities.js'), speak: jest.fn(), }));Tomemos otro escenario común, estás usando la enzima ShallowWrapper y no funciona bien con el gancho useContext(), entonces, ¿qué vas a hacer? Si bien estoy seguro de que hay varias formas, pero esta es la que me gusta:
import React from "react"; jest.mock("react", () => ({ ...jest.requireActual("react"), // import and retain the original functionalities useContext: jest.fn().mockReturnValue({foo: 'bar'}) // overwrite useContext })) La ventaja de hacerlo de esta manera es que aún puede usar import React, { useContext } from "react" en su código original sin preocuparse por convertirlos en React.useContext() como lo haría si estuviera usando jest.spyOn( Reaccionar, 'usarContexto')
La forma más sencilla es usar jest.spyOn y luego .mockImplementation() . Esto permitirá que todas las demás funciones en el módulo continúen funcionando como están definidas.
Para paquetes:
import axios from 'axios'; jest.spyOn(axios, 'get'); axios.get.mockImplementation(() => { /* do thing */ });Para módulos con exportaciones con nombre:
import * as utils from './utilities.js'; jest.spyOn(utils, 'speak'); utils.speak.mockImplementation(() => { /* do thing */ });Documentos aquí: https://jestjs.io/docs/en/jest-object#jestspyonobject-methodname
Para mí esto funcionó:
const utils = require('./utilities.js'); ... jest.spyOn(utils, 'speak').mockImplementation(() => jest.fn());