Je commence à penser que ce n'est pas possible, mais je veux quand même demander.
Je veux tester qu'un de mes modules ES6 appelle un autre module ES6 d'une manière particulière. Avec Jasmine, c'est super facile -
Le code de l'application:
// myModule.js
import dependency from './dependency';
export default (x) => {
dependency.doSomething(x * 2);
}
Et le code de test:
//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);
});
});
Quel est l'équivalent avec Jest? J'ai l'impression que c'est une chose si simple à vouloir faire, mais je me suis arraché les cheveux en essayant de le comprendre.
Le plus proche que je suis venu est de remplacer le import
s par le require
s et de les déplacer dans les tests / fonctions. Je ne veux pas faire quoi que ce soit.
// 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);
});
});
Pour les points bonus, je serais ravi de faire fonctionner le tout lorsque la fonction à l'intérieur dependency.js
est une exportation par défaut. Cependant, je sais que l'espionnage des exportations par défaut ne fonctionne pas dans Jasmine (ou du moins je ne pourrais jamais le faire fonctionner), donc je n'espère pas que cela soit possible dans Jest.
la source
import
s enrequire
s pour l'instant. Merci de m'avoir mis au courant.Réponses:
J'ai pu résoudre ce problème en utilisant un hack impliquant
import *
. Cela fonctionne même pour les exportations nommées et par défaut!Pour une exportation nommée:
Ou pour une exportation par défaut:
Comme Mihai Damian l'a souligné à juste titre ci-dessous, cela modifie l'objet du module
dependency
, et il va donc `` fuir '' vers d'autres tests. Donc, si vous utilisez cette approche, vous devez stocker la valeur d'origine, puis la rétablir à nouveau après chaque test. Pour ce faire facilement avec Jest, utilisez la méthode spyOn () au lieu dejest.fn()
car elle prend en charge la restauration facile de sa valeur d'origine, évitant ainsi la «fuite» mentionnée précédemment.la source
dependency
trouve sur le même fichier quemyModule
, cela ne fonctionnera pas.Vous devez vous moquer du module et définir l'espion par vous-même:
la source
babel-plugin-jest-hoist: The second argument of jest.mock must be a function.
Donc, le code ne compile même pas.jest.mock
est relatif au fichier de test.__esModule: true
à l'objet maquette. C'est l'indicateur interne utilisé par le code transpilé pour déterminer s'il s'agit d'un module es6 transpilé ou d'un module commonjs.jest.mock('../dependency', () => ({ default: jest.fn() }))
Pour simuler une exportation par défaut du module de dépendance ES6 à l'aide de jest:
Les autres options n'ont pas fonctionné pour mon cas.
la source
Ajout de plus à la réponse d'Andreas. J'ai eu le même problème avec le code ES6 mais je ne voulais pas muter les importations. Cela semblait bizarre. Alors j'ai fait ça
Et ajouté dependency.js dans le dossier "__ mocks __" parallèle à dependency.js. Cela a fonctionné pour moi. De plus, cela m'a donné la possibilité de renvoyer des données appropriées à partir d'une implémentation fictive. Assurez-vous de donner le chemin correct au module que vous souhaitez simuler.
la source
__mocks__/translations.js
fichier exporte simplement par défautjest.fn()
dans quelque chose comme:export default jest.fn((id) => id)
jest.genMockFromModule
pour générer des simulations à partir de modules. facebook.github.io/jest/docs/…export default jest.genMockFromModule('../dependency')
auront toutes leurs fonctions assignées àdependency.default
après avoir appelé `jest.mock ('.. dépendance'), mais se comportent autrement comme prévu.expect(???)
Avance rapide jusqu'en 2020, j'ai trouvé ce lien comme la solution. en utilisant uniquement la syntaxe du module ES6 https://remarkablemark.org/blog/2018/06/28/jest-mock-default-named-export/
Une chose que vous devez également savoir (ce qui m'a pris du temps à comprendre) est que vous ne pouvez pas appeler jest.mock () dans le test; vous devez l'appeler au niveau supérieur du module. Cependant, vous pouvez appeler mockImplementation () dans des tests individuels si vous souhaitez configurer différents mocks pour différents tests.
la source
La question est déjà répondue mais vous pouvez la résoudre comme ceci:
dependency.js
myModule.js:
myModule.spec.js:
la source
J'ai résolu cela d'une autre manière. Disons que vous avez votre dependency.js
Je crée en plus un fichier depdency.mock.js avec le contenu suivant:
et dans le test, avant d'importer le fichier qui a la dépendance que j'utilise:
la source