J'ai rencontré un problème en essayant de se moquer d'une méthode de classe statique dans Jest. Ce comportement est-il pris en charge ?
Posté sur http://stackoverflow.com/questions/38206478/mocking-methods-in-jest
J'ai un test unitaire très simple qui ressemble à ceci:
import ApiWrapper from '../../services/api_wrapper';
jest.unmock('../helper')
describe('Helper', () => {
let Helper;
beforeEach(() => {
Helper = require('../helper').default;
});
it('calls the Api Wrapper', () => {
Helper.help()
expect(ApiWrapper.help).toHaveBeenCalled();
});
});
Où Helper ressemble à ceci :
import ApiWrapper from '../services/api_wrapper'
class Helper {
help() {
ApiWrapper.help()
}
}
export default new Helper();
Et ApiWrapper ressemble à ceci :
class ApiWrapper {
static help () {
console.log('help!')
}
}
export default ApiWrapper;
ApiWrapper.help() se moque de Jest alors "Aide !" n'est jamais imprimé, mais l'attente du test échoue. Cela échoue toujours si nous réécrivons ApiWrapper pour qu'il soit simplement un simple objet Javascript comme celui-ci :
export default {
help: () => { console.log('help!'); }
}
Cela fonctionne, cependant, si nous modifions les importations dans la spécification (donc ApiWrapper est importé dans le beforeEach) et réécrivons ApiWrapper pour qu'il soit une classe Singleton, comme ceci :
class ApiWrapper {
help() {
console.log('help!');
}
}();
export default new ApiWrapper();
Qu'est-ce qui explique le comportement moqueur de Jest ?
L'assertion correcte doit être toBeCalled
. Peux-tu essayer ça ?
Désolé, c'est ce que je voulais dire. J'ai tapé l'exemple directement dans Stackoverflow.
Jest réinitialise le registre du module à chaque appel à it
. Vous avez besoin de ApiWrapper
en haut et de Helper
intérieur avantEach, donc Helper reçoit probablement une copie différente de ApiWrapper
. Pour y remédier, vous pouvez :
beforeEach
Explication simplifiée :
var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.
Faites-moi savoir si cela ne résout pas votre problème.
Commentaire le plus utile
Jest réinitialise le registre du module à chaque appel à
it
. Vous avez besoin deApiWrapper
en haut et deHelper
intérieur avantEach, donc Helper reçoit probablement une copie différente deApiWrapper
. Pour y remédier, vous pouvez :beforeEach
Explication simplifiée :
Faites-moi savoir si cela ne résout pas votre problème.