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?
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:
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.
Hilfreichster Kommentar
Jest setzt die Modulregistrierung bei jedem Aufruf auf
it
. Du benötigstApiWrapper
oben undHelper
jedem, also erhält Helper wahrscheinlich eine andere Kopie vonApiWrapper
. Um es zu beheben, können Sie:beforeEach
Vereinfachte Erklärung:
Lass es mich wissen, wenn das dein Problem nicht behebt.