Wie kann ich einen ES6-Modulimport mit Jest verspotten?

Ich fange an zu denken, dass dies nicht möglich ist, aber ich möchte trotzdem fragen.

Ich möchte testen, ob eines meiner ES6-Module auf eine bestimmte Weise ein anderes ES6-Modul aufruft. Mit Jasmine ist das ganz einfach -

Der App-Code:

// myModule.js
import dependency from './dependency';

export default (x) => {
  dependency.doSomething(x * 2);
}

Und der Testcode:

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

Was ist das Äquivalent zu Jest? Ich habe das Gefühl, dass dies so einfach ist, aber ich habe mir die Haare ausgerissen, um es herauszufinden.

Das nächste, das ich gekommen bin, ist durch Ersetzen desimports mitrequires und Verschieben innerhalb der Tests / Funktionen. Weder von denen sind Dinge, die ich tun möchte.

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

Für Bonuspunkte würde ich das Ganze gerne zum Laufen bringen, wenn die Funktion independency.js ist ein Standardexport. Ich weiß jedoch, dass das Ausspionieren von Standardexporten in Jasmine nicht funktioniert (oder zumindest könnte ich es nie zum Laufen bringen), und hoffe daher nicht, dass es auch in Jest möglich ist.

Antworten auf die Frage(8)

Ihre Antwort auf die Frage