Estoy empezando a pensar que esto no es posible, pero quiero preguntar de todos modos.
Quiero probar que uno de mis módulos ES6 llama a otro módulo ES6 de una manera particular. Con Jasmine esto es súper fácil.
El código de la aplicación:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
Y el código de prueba:
//myModule-test.js
import myModule from '../myModule';
import dependency from '../dependency';
describe('myModule', () => {
it('calls the dependency with double the input', () => {
spyOn(dependency, 'doSomething');
myModule(2);
expect(dependency.doSomething).toHaveBeenCalledWith(4);
});
});
¿Cuál es el equivalente con Jest? Siento que esto es algo tan simple que quiero hacer, pero me he estado arrancando el pelo tratando de resolverlo.
Lo más cerca que he estado es reemplazando import
s con require
s, y moviéndolos dentro de las pruebas / funciones. Ninguna de las cuales son cosas que quiero hacer.
// myModule.js
export default (x) => {
const dependency = require('./dependency'); // yuck
dependency.doSomething(x * 2);
}
//myModule-test.js
describe('myModule', () => {
it('calls the dependency with double the input', () => {
jest.mock('../dependency');
myModule(2);
const dependency = require('../dependency'); // also yuck
expect(dependency.doSomething).toBeCalledWith(4);
});
});
Para obtener puntos de bonificación, me encantaría hacer que todo funcione cuando la función dentro dependency.js
es una exportación predeterminada. Sin embargo, sé que espiar las exportaciones predeterminadas no funciona en Jasmine (o al menos nunca podría hacerlo funcionar), por lo que tampoco tengo la esperanza de que sea posible en Jest.
fuente
import
s arequire
s por ahora. Gracias por el aviso.Respuestas:
He podido resolver esto usando un truco que involucra
import *
. ¡Incluso funciona para exportaciones con nombre y predeterminadas!Para una exportación con nombre:
O para una exportación predeterminada:
Como Mihai Damian señaló con razón a continuación, esto está mutando el objeto del módulo
dependency
y, por lo tanto, se 'filtrará' a otras pruebas. Entonces, si usa este enfoque, debe almacenar el valor original y luego volverlo a configurar después de cada prueba. Para hacer esto fácilmente con Jest, use el método spyOn () en lugar dejest.fn()
porque admite restaurar fácilmente su valor original, evitando así la 'fuga' antes mencionada.fuente
dependency
reside en el mismo archivo quemyModule
, no funcionará.Tienes que burlarte del módulo y configurar el espía tú mismo:
fuente
babel-plugin-jest-hoist: The second argument of jest.mock must be a function.
el código ni siquiera se está compilando.jest.mock
es relativa al archivo de prueba.__esModule: true
al objeto simulado. Esa es la bandera interna utilizada por el código transpilado para determinar si se trata de un módulo es6 transpilado o un módulo commonjs.jest.mock('../dependency', () => ({ default: jest.fn() }))
Para burlarse de una exportación predeterminada del módulo de dependencia ES6 usando jest:
Las otras opciones no funcionaron para mi caso.
fuente
Añadiendo más a la respuesta de Andreas. Tuve el mismo problema con el código ES6 pero no quise mutar las importaciones. Eso parecía hacky. Entonces hice esto
Y agregó dependency.js en la carpeta "__ mocks __" paralela a dependency.js. Esto funcionó para mí. Además, esto me dio la opción de devolver datos adecuados de la implementación simulada. Asegúrese de dar la ruta correcta al módulo que desea simular.
fuente
__mocks__/translations.js
archivo simplemente exporta por defectojest.fn()
en algo como:export default jest.fn((id) => id)
jest.genMockFromModule
para generar simulacros a partir de módulos. facebook.github.io/jest/docs/…export default jest.genMockFromModule('../dependency')
tendrán todas sus funciones asignadasdependency.default
después de llamar a `jest.mock ('... dependencia'), pero de lo contrario se comportarán como se espera.expect(???)
Avance rápido hasta 2020, este enlace me pareció la solución. utilizando solo la sintaxis del módulo ES6 https://remarkablemark.org/blog/2018/06/28/jest-mock-default-named-export/
También una cosa que necesita saber (que me llevó un tiempo descubrir) es que no puede llamar a jest.mock () dentro de la prueba; debes llamarlo en el nivel superior del módulo. Sin embargo, puede llamar a mockImplementation () dentro de pruebas individuales si desea configurar diferentes simulacros para diferentes pruebas.
fuente
La pregunta ya está respondida, pero puede resolverla así:
dependency.js
myModule.js:
myModule.spec.js:
fuente
Resolví esto de otra manera. Digamos que tienes tu dependencia.js
Creo un archivo depdency.mock.js junto con el siguiente contenido:
y en la prueba, antes de importar el archivo que tiene la dependencia que uso:
fuente