Jest: Se moquer des méthodes de classe statique

Créé le 5 juil. 2016  ·  3Commentaires  ·  Source: facebook/jest

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 ?

Commentaire le plus utile

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 :

  • Importez les deux classes en haut.
  • Exiger les deux cours en 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.

Tous les 3 commentaires

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 :

  • Importez les deux classes en haut.
  • Exiger les deux cours en 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.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

nsand picture nsand  ·  3Commentaires

ianp picture ianp  ·  3Commentaires

hramos picture hramos  ·  3Commentaires

jardakotesovec picture jardakotesovec  ·  3Commentaires

stephenlautier picture stephenlautier  ·  3Commentaires