Heim > Web-Frontend > js-Tutorial > Wie kann man mit Jest effektiv Funktionen innerhalb desselben Moduls verspotten?

Wie kann man mit Jest effektiv Funktionen innerhalb desselben Moduls verspotten?

DDD
Freigeben: 2024-12-16 02:25:14
Original
949 Leute haben es durchsucht

How to Effectively Mock Functions Within the Same Module Using Jest?

Verspotten von Funktionen im selben Modul mit Jest

Beim Verspotten von Funktionen innerhalb desselben Moduls ist es wichtig, die Einschränkungen des Standard-Verspottens von Jest zu verstehen Mechanismus.

Problem:

Das Importieren des Moduls und das direkte Verspotten seiner exportierten Funktion, wie im Beispiel unten, kann zu unerwartetem Verhalten führen.

// module.js
export function bar() { return 'bar'; }
export function foo() { return `I am foo. bar is ${bar()}`; }

// module.test.js
import * as module from '../src/module';

describe('module', () => {
  let barSpy;

  beforeEach(() => {
    barSpy = jest.spyOn(module, 'bar').mockImplementation(jest.fn());
  });

  it('foo', () => {
    module.bar.mockReturnValue('fake bar');
    expect(module.foo()).toEqual('I am foo. bar is fake bar');
    // Fails: Expected "I am foo. bar is fake bar" but received "I am foo. bar is bar"
  });
});
Nach dem Login kopieren

Erklärung:

Im obigen Beispiel ruft foo direkt die Originalleiste auf Funktion während der Importzeit. Auch wenn barSpy während des Testaufbaus korrekt aktualisiert wird, verweist foo immer noch auf die nicht verspottete Bar-Funktion, was zu einer falschen Ausgabe führt.

Lösung 1:

Importieren Sie das Modul in seine eigene Codedatei:

Um dieses Problem zu umgehen, kann das Modul in seine eigene Codedatei importiert werden, um dies sicherzustellen Alle exportierten Entitäten werden aus derselben Instanz importiert.

// module.js
export function bar() { return 'bar'; }
export function foo() { return `I am foo. bar is ${thisModule.bar()}`; }

// module.test.js
import * as module from './module';

describe('module', () => {
  it('foo', () => {
    spyOn(module, 'bar').and.returnValue('fake bar');
    expect(module.foo()).toEqual('I am foo. bar is fake bar');
  });
});
Nach dem Login kopieren

In diesem modifizierten Beispiel greift foo jetzt über die importierte Instanz module.bar auf bar zu, was ein einfaches Verspotten ermöglicht.

Lösung 2:

Manuell verspotten Importe:

Alternativ können die Importe im Test-Setup manuell gemockt werden, wodurch eine neue Instanz des Moduls erstellt wird, die von der nicht gemockten Version isoliert ist.

// module.test.js
jest.mock('../src/module');
const * as mockedModule = require('../src/module');

describe('module', () => {
  beforeEach(() => {
    mockedModule.bar.mockImplementation(jest.fn());
  });

  it('foo', () => {
    mockedModule.bar.mockReturnValue('fake bar');
    expect(mockedModule.foo()).toEqual('I am foo. bar is fake bar');
  });
});
Nach dem Login kopieren

Hier Ansatz wird die verspottete Instanz „mockedModule“ zum Testen verwendet, um Störungen durch die nicht verspotteten Importe zu verhindern.

Das obige ist der detaillierte Inhalt vonWie kann man mit Jest effektiv Funktionen innerhalb desselben Moduls verspotten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage