Jest: Verspotten statischer Klassenmethoden

Erstellt am 5. Juli 2016  ·  3Kommentare  ·  Quelle: facebook/jest

Ich bin auf ein Problem gestoßen, als ich versuchte, eine statische Klassenmethode in Jest zu verspotten. Wird dieses Verhalten unterstützt?

Cross-Posted unter http://stackoverflow.com/questions/38206478/mocking-methods-in-jest

Ich habe einen sehr einfachen Unit-Test, der so aussieht:

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();
    });

});

Wo Helper so aussieht:

import ApiWrapper from '../services/api_wrapper'
class Helper {
    help() {
        ApiWrapper.help()
    }
}

export default new Helper();

Und ApiWrapper sieht so aus:

class ApiWrapper {
  static help () {
     console.log('help!')
  }
}
export default ApiWrapper;

ApiWrapper.help() wird von Jest verspottet, also 'Hilfe!' wird nie gedruckt, dennoch scheitert die Erwartung im Test. Dies schlägt immer noch fehl, wenn wir ApiWrapper so umschreiben, dass es nur ein einfaches Javascript-Objekt wie dieses ist:

export default {
    help: () => { console.log('help!'); }
}

Es funktioniert jedoch, wenn wir die Importe in der Spezifikation ändern (also ApiWrapper in beforeEach importiert wird) und ApiWrapper in eine Singleton-Klasse umschreiben, wie folgt:

class ApiWrapper {
   help() {
      console.log('help!');
   }
}();

export default new ApiWrapper();

Was macht Jests spöttisches Verhalten dazu?

Hilfreichster Kommentar

Jest setzt die Modulregistrierung bei jedem Aufruf auf it . Du benötigst ApiWrapper oben und Helper jedem, also erhält Helper wahrscheinlich eine andere Kopie von ApiWrapper . Um es zu beheben, können Sie:

  • Importieren Sie beide Klassen oben.
  • Benötigen Sie beide Klassen in beforeEach

Vereinfachte Erklärung:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Lass es mich wissen, wenn das dein Problem nicht behebt.

Alle 3 Kommentare

Die korrekte Behauptung sollte toBeCalled lauten. Kannst du das versuchen?

Entschuldigung, das meinte ich. Ich habe das Beispiel direkt in Stackoverflow eingegeben.

Jest setzt die Modulregistrierung bei jedem Aufruf auf it . Du benötigst ApiWrapper oben und Helper jedem, also erhält Helper wahrscheinlich eine andere Kopie von ApiWrapper . Um es zu beheben, können Sie:

  • Importieren Sie beide Klassen oben.
  • Benötigen Sie beide Klassen in beforeEach

Vereinfachte Erklärung:

var A = require('A');
jest.resetModuleRegistry();
A !== require('A'); // true, A is not the exact same module as before we reset the registry.

Lass es mich wissen, wenn das dein Problem nicht behebt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen