Heim > Web-Frontend > js-Tutorial > Hauptteil

Testprobleme mit Jest und ESM und wie man sie behebt

Linda Hamilton
Freigeben: 2024-11-09 22:05:02
Original
741 Leute haben es durchsucht

Testing Troubles with Jest and ESM and how to fix it

Diese Woche wurde ich damit beauftragt, Tests zu meinem RefactorCode-Projekt hinzuzufügen. Als ich anfing, neue Funktionen hinzuzufügen, bemerkte ich, dass einige vorhandene Funktionen nicht mehr funktionierten und es immer schwieriger wurde, alles manuell zu testen. Dies machte deutlich, dass ich ordnungsgemäße automatisierte Tests implementieren musste, um sicherzustellen, dass die Anwendung stabil ist.

Da ich bereits Erfahrung mit Jest aus meinem vorherigen Kurs „Cloud Computing für Programmierer“ hatte, in dem ich mit Node.js gearbeitet habe, habe ich beschlossen, es auch für dieses Projekt zu verwenden. Ich begann damit, einige Tests zu schreiben, um die Funktionalität meines Codes zu überprüfen. Allerdings bin ich auf ein paar Fehler gestoßen, mit denen ich vorher noch nicht konfrontiert war. Nach einigem Debuggen und Durchsuchen von Stack Overflow wurde mir klar, dass bei der Verwendung von ESM (ECMAScript-Modulen) mit Jest zusätzliche Konfigurationen erforderlich sind. In meinem vorherigen Projekt hatte ich CommonJS verwendet, was perfekt funktionierte. Während ich mich für die Konvertierung für Babel hätte entscheiden können, bot Jest eine neue Beta-Funktion an, mit der ESM direkt ausgeführt werden konnte. Ich habe beschlossen, es auszuprobieren, und es hat großartig funktioniert!

Hier wird alles erklärt, was mit der Konfiguration von Jest mit ESM zu tun hat: https://jestjs.io/docs/ecmascript-modules

Hier ein kurzer Überblick über die Einrichtung:

Jest installieren:

npm install --save-dev jest
Nach dem Login kopieren
Nach dem Login kopieren

Erstellen Sie eine jest.config.js-Datei. Hier stelle ich auch ein, welche Ordner ignoriert werden sollen:

export default {
  testPathIgnorePatterns: ["/node_modules/", "/examples"],
  transform: {},
};
Nach dem Login kopieren
Nach dem Login kopieren

Verwenden Sie im Abschnitt „package.json-Skripte“ das experimentelle Argument, damit jest mit ESM-Modulen funktioniert:

"scripts": {
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"
}
Nach dem Login kopieren

Erstellen Sie eine Testdatei. Ich habe alle Tests in einem Testordner im Stammverzeichnis erstellt. Hier ist ein einfaches, das ich erstellt habe:

import { readFile, checkIfDirectory } from "../src/fileUtils";

describe("File Utility", () => {
    test("Read File", () => {
      readFile("./examples/test.txt").then((data) => {
        expect(data).toBe("Hello World");
      });

    });

    test('should return true if the path is a directory', async () => {
      const result = await checkIfDirectory('./examples');
      expect(result).toBe(true);
    });
});
Nach dem Login kopieren

Wenn Sie mit einer einzelnen Testdatei testen möchten:

npm test -- banner.test.js
Nach dem Login kopieren

Um alle Tests auszuführen, verwenden wir das Skript, das wir zuvor in package.json hinzugefügt haben:

npm run test
Nach dem Login kopieren

Endlich wurden die Grundtests aufgebaut. Dies war jedoch erst der Anfang meiner Reise zur Fehlerbehebung. Ich hatte auch Schwierigkeiten damit, Bibliotheken und Module zu verspotten, insbesondere da sie ESM verwendeten. Diese erforderten eine zusätzliche Konfiguration, aber nach einigen Optimierungen konnte ich alles zum Laufen bringen und die Tests liefen erfolgreich.

Anstatt das reguläre jest.mock zu verwenden, müssen Sie jest.unstable_mockModule:
verwenden

For example: await jest.unstable_mockModule("fs", () => ({
  existsSync: jest.fn(),
  readFileSync: jest.fn(),
}));
Nach dem Login kopieren

Weitere Informationen finden Sie in diesem Abschnitt.

Eine der Kernfunktionen, die ich testen wollte, war die Integration mit der Gemini-API. Da ich mich zum Testen nicht auf die Live-API verlassen wollte, habe ich beschlossen, die API-Aufrufe zu simulieren. Anfangs habe ich versucht, Nock zu verwenden, aber es gab Probleme, weil es mit der Standard-Abrufimplementierung von Node nicht gut funktionierte. Es schien, dass die Gemini-Bibliothek den Standardabruf anstelle einer Abrufimplementierung eines Drittanbieters verwendete, was dazu führte, dass der Mock fehlschlug. Nach mehreren erfolglosen Versuchen wechselte ich zu einer anderen Bibliothek namens MSW (Mock Service Worker). Obwohl die Erstellung eines Scheinservers etwas mehr Setup erforderte, funktionierte es beim ersten Versuch einwandfrei. Ich habe eine Beispielantwort basierend auf der Reaktion der Gemini-API erstellt, die es mir ermöglichte, die überarbeitete Funktionalität zu testen.

So wurde der Mock-Server als Referenz eingerichtet:

npm install --save-dev jest
Nach dem Login kopieren
Nach dem Login kopieren

Sie können sehen, dass ich einen bestimmten API-Endpunkt verspotte, den ich für die Anwendung verwende. Jetzt müssen Sie nur noch Folgendes hinzufügen, um den Server während des Tests zu starten:

export default {
  testPathIgnorePatterns: ["/node_modules/", "/examples"],
  transform: {},
};
Nach dem Login kopieren
Nach dem Login kopieren

Wenn ich über den Prozess nachdenke, war dies eine großartige Lernerfahrung für mich. Im Nachhinein hätte ich wahrscheinlich vorher die Kompatibilität der von mir verwendeten Bibliotheken überprüfen und mögliche Probleme berücksichtigen sollen. Trotz der Herausforderungen bin ich froh, einen Punkt erreicht zu haben, an dem meine Tests reibungslos verlaufen. Ich freue mich darauf, in Zukunft weitere Tests hinzuzufügen und die Gesamtstabilität meines Projekts zu verbessern.

Das obige ist der detaillierte Inhalt vonTestprobleme mit Jest und ESM und wie man sie behebt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage