Jest ist großartig darin, Importe in Javascript/Typescript zu verspotten, aber es fällt mir sehr schwer, mich an Implementierungsdetails zu erinnern.
Funktionen und Objekte müssen auf unterschiedliche Weise verspottet werden, Standardexporte werden auf subtile Weise anders verspottet als benannte Exporte und Jest funktioniert nicht besonders gut mit Typoskript. Wenn Sie all diese Dinge kombinieren, kann es schwierig sein, den richtigen Ansatz für Ihr Spottszenario zu finden oder gar danach zu suchen.
Ich habe diesen Leitfaden erstellt, um die Frage zu beantworten „Wie verspotte ich meinen Import?“unabhängig davon, um welchen Import es sich handelt. Standard oder benannt, Funktion oder Objekt.
Meine Umgebung
Ich habe alle diese Ansätze mit den folgenden Softwareversionen getestet:
- Knoten v22.11.0
- jest v29.7.0
- ts-jest v29.2.5
- @types/jest v29.5.14
Und mit einer standardmäßigen, minimalen jest.config.js-Datei:
export default { testEnvironment: 'node', transform: { '^.+.tsx?$': ['ts-jest', {}], }, testMatch: ['**/*.test.ts'], };
Verspottung von Importen
Weit verbreitete Importe lassen sich in zwei Kategorien einteilen, über die wir uns vielleicht lustig machen möchten:
- Funktionen
- Objekte
Wir werden beide nacheinander angehen, beginnend mit den Funktionen.
Funktionen importieren
Aus Modulen exportierte Funktionen können benannt oder standardmäßig sein. Wir werden uns beides ansehen. Erstens:
Verspotten einer benannten exportierten Funktion aus einem Modul
Dies sollte verwendet werden, um eine benannte exportierte Funktion aus einem Modul zu verspotten, etwa so:
// ./path/to/module.ts export function doSomething(...) { ... }
Es kann so verspottet werden:
import { doSomething } from './path/to/module'; // note: This should be the path to the module from the test file, // NOT from the module that contains the doSomething function itself. jest.mock('./path/to/module', () => ({ doSomething: jest.fn(), })); ... it('should do something', () => { // We need to assert that the function is a jest.Mock // so that typescript will allow us to call mock methods. (doSomething as jest.Mock).mockReturnValue(mockValue); // run your test here expect(doSomething).toHaveBeenCalledTimes(1); // etc. });
Verspottung der von einem Modul zurückgegebenen Standardfunktion
Dies sollte verwendet werden, um eine Funktion zu verspotten, die der Standardexport aus einem Modul ist, etwa so:
// ./path/to/module.ts export default function doSomething(...) { ... }
Es wird ähnlich verspottet wie benannte Exporte:
import doSomething from './path/to/module' jest.mock('./path/to/module', () => ({ __esModule: true, default: jest.fn() })) ... it('should do something', () => { (doSomething as jest.Mock).mockResolvedValue(mockData); // Run your test here expect(doSomething).toHaveBeenCalledTimes(5); });
Objekte importieren
Beim Verspotten eines exportierten Objekts (sei es eine Klasse, ein JSON-Objekt oder etwas anderes) sind einige Variationen zu berücksichtigen.
- Ist es ein benannter oder ein Standardexport?
- Verfügt es über Methoden, die wir ebenfalls verspotten möchten, oder nur über Eigenschaften?
Verspotten von Standardobjekten ohne Methoden
Wenn Sie nur Eigenschaften verspotten müssen (zum Beispiel eine Konfigurationsdatei), nicht Methoden, dann gehen Sie wie folgt vor:
import config from '../config'; jest.mock('../config', () => ({ __esModule: true, default: { apiKey: '123MockKey', ... }, })); ... it('Should do something', () => { ... });
Und wenn die simulierten Eigenschaften je nach Test variieren müssen:
import config from '../config'; const mockConfig = { apiKey: '123MockKey', ... }; jest.mock('../config', () => ({ __esModule: true, default: mockConfig, })); ... beforeEach(() => { // restore defaults before each test mockConfig.apiKey = '123MockKey'; ... }); it('Should do something', () => { mockConfig.apiKey = 'new value'; // rest of the test }); // more tests
Benannte Exportobjekte ohne Methoden verspotten
Sehr ähnlich zum Verspotten von Standardexportobjekten:
import { config } from '../config'; const mockConfig = { apiKey: '123MockKey', ... }; jest.mock('../config', () => ({ config: mockConfig, })); // the rest is exactly the same as when mocking a default export object.
Ein Objekt mit Methoden verspotten
Wenn ein Objekt mit Methoden aus einem Modul exportiert wird (benannt oder standardmäßig) und wir die Ausgabe dieser Methoden nachahmen müssen, ist der Ansatz etwas anders.
Eine Klasse gegeben:
// ./path/to/module.ts class ComplicatedThing { // properties, fields, constructor etc. go here getData() { ... } ... } // note: I don't necessarily recommend exporting an instance // of a class like this - purely illustrative for testing purposes. // https://medium.com/@lazlojuly/are-node-js-modules-singletons-764ae97519af export const complicatedThing = new ComplicatedThing(...);
Und um unser exportiertes Objekt zu verspotten:
export default { testEnvironment: 'node', transform: { '^.+.tsx?$': ['ts-jest', {}], }, testMatch: ['**/*.test.ts'], };
Das Verspotten eines Standardexportobjekts ist genau das Gleiche, außer wenn wir das Mock definieren:
// ./path/to/module.ts export function doSomething(...) { ... }
Bonus: Verspottungsmethoden für ein Objekt, das direkt als Parameter an eine Testfunktion/-klasse übergeben wird
Dies dient dazu, ein Objekt zu verspotten, das nicht direkt in ein Modul importiert wird, das Sie testen, sondern stattdessen als Parameter an eine Klasse/Funktion übergeben wird.
Hinweis: Wenn Sie eine Klasse verspotten, möchten Sie möglicherweise stattdessen eine Schnittstelle und eine Scheinimplementierung davon erstellen, um sie an Ihre Funktion/Klasse zu übergeben. Dadurch ersparen Sie sich die folgenden uneleganten Typenbehauptungs-Spielereien.
import { doSomething } from './path/to/module'; // note: This should be the path to the module from the test file, // NOT from the module that contains the doSomething function itself. jest.mock('./path/to/module', () => ({ doSomething: jest.fn(), })); ... it('should do something', () => { // We need to assert that the function is a jest.Mock // so that typescript will allow us to call mock methods. (doSomething as jest.Mock).mockReturnValue(mockValue); // run your test here expect(doSomething).toHaveBeenCalledTimes(1); // etc. });
// ./path/to/module.ts export default function doSomething(...) { ... }
import doSomething from './path/to/module' jest.mock('./path/to/module', () => ({ __esModule: true, default: jest.fn() })) ... it('should do something', () => { (doSomething as jest.Mock).mockResolvedValue(mockData); // Run your test here expect(doSomething).toHaveBeenCalledTimes(5); });
Abschluss
Ich hoffe, dass dies für Sie und mein zukünftiges Ich nützlich sein wird, wenn ich das nächste Mal Schwierigkeiten habe, mich an die Details zum Verspotten von Importen in Typoskript zu erinnern.
Ich hoffe, dass es alle Ihre einfachen Mock-Bedürfnisse abdecken kann und Ihnen einen Ausgangspunkt für das Mock-Making komplexerer Importe bietet.
Danke fürs Lesen.
Das obige ist der detaillierte Inhalt vonSpott mit Scherz und Typoskript – ein Spickzettel. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Zu den Anwendungen von JavaScript in der realen Welt gehören die serverseitige Programmierung, die Entwicklung mobiler Anwendungen und das Internet der Dinge. Die serverseitige Programmierung wird über node.js realisiert, die für die hohe gleichzeitige Anfrageverarbeitung geeignet sind. 2. Die Entwicklung der mobilen Anwendungen erfolgt durch reaktnative und unterstützt die plattformübergreifende Bereitstellung. 3.. Wird für die Steuerung von IoT-Geräten über die Johnny-Five-Bibliothek verwendet, geeignet für Hardware-Interaktion.

Ich habe eine funktionale SaaS-Anwendung mit mehreren Mandanten (eine EdTech-App) mit Ihrem täglichen Tech-Tool erstellt und Sie können dasselbe tun. Was ist eine SaaS-Anwendung mit mehreren Mietern? Mit Multi-Tenant-SaaS-Anwendungen können Sie mehrere Kunden aus einem Sing bedienen

Dieser Artikel zeigt die Frontend -Integration mit einem Backend, das durch die Genehmigung gesichert ist und eine funktionale edtech SaaS -Anwendung unter Verwendung von Next.js. erstellt. Die Frontend erfasst Benutzerberechtigungen zur Steuerung der UI-Sichtbarkeit und stellt sicher, dass API-Anfragen die Rollenbasis einhalten

JavaScript ist die Kernsprache der modernen Webentwicklung und wird für seine Vielfalt und Flexibilität häufig verwendet. 1) Front-End-Entwicklung: Erstellen Sie dynamische Webseiten und einseitige Anwendungen durch DOM-Operationen und moderne Rahmenbedingungen (wie React, Vue.js, Angular). 2) Serverseitige Entwicklung: Node.js verwendet ein nicht blockierendes E/A-Modell, um hohe Parallelitäts- und Echtzeitanwendungen zu verarbeiten. 3) Entwicklung von Mobil- und Desktop-Anwendungen: Die plattformübergreifende Entwicklung wird durch reaktnative und elektronen zur Verbesserung der Entwicklungseffizienz realisiert.

Zu den neuesten Trends im JavaScript gehören der Aufstieg von Typenkripten, die Popularität moderner Frameworks und Bibliotheken und die Anwendung der WebAssembly. Zukunftsaussichten umfassen leistungsfähigere Typsysteme, die Entwicklung des serverseitigen JavaScript, die Erweiterung der künstlichen Intelligenz und des maschinellen Lernens sowie das Potenzial von IoT und Edge Computing.

JavaScript ist der Eckpfeiler der modernen Webentwicklung. Zu den Hauptfunktionen gehören eine ereignisorientierte Programmierung, die Erzeugung der dynamischen Inhalte und die asynchrone Programmierung. 1) Ereignisgesteuerte Programmierung ermöglicht es Webseiten, sich dynamisch entsprechend den Benutzeroperationen zu ändern. 2) Die dynamische Inhaltsgenerierung ermöglicht die Anpassung der Seiteninhalte gemäß den Bedingungen. 3) Asynchrone Programmierung stellt sicher, dass die Benutzeroberfläche nicht blockiert ist. JavaScript wird häufig in der Webinteraktion, der einseitigen Anwendung und der serverseitigen Entwicklung verwendet, wodurch die Flexibilität der Benutzererfahrung und die plattformübergreifende Entwicklung erheblich verbessert wird.

Python eignet sich besser für Datenwissenschaft und maschinelles Lernen, während JavaScript besser für die Entwicklung von Front-End- und Vollstapel geeignet ist. 1. Python ist bekannt für seine prägnante Syntax- und Rich -Bibliotheks -Ökosystems und ist für die Datenanalyse und die Webentwicklung geeignet. 2. JavaScript ist der Kern der Front-End-Entwicklung. Node.js unterstützt die serverseitige Programmierung und eignet sich für die Entwicklung der Vollstapel.

JavaScript erfordert keine Installation, da es bereits in moderne Browser integriert ist. Sie benötigen nur einen Texteditor und einen Browser, um loszulegen. 1) Führen Sie sie in der Browser -Umgebung durch, indem Sie die HTML -Datei durch Tags einbetten. 2) Führen Sie die JavaScript -Datei nach dem Herunterladen und Installieren von node.js nach dem Herunterladen und Installieren der Befehlszeile aus.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

ZendStudio 13.5.1 Mac
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Herunterladen der Mac-Version des Atom-Editors
Der beliebteste Open-Source-Editor

Dreamweaver CS6
Visuelle Webentwicklungstools

MinGW – Minimalistisches GNU für Windows
Dieses Projekt wird derzeit auf osdn.net/projects/mingw migriert. Sie können uns dort weiterhin folgen. MinGW: Eine native Windows-Portierung der GNU Compiler Collection (GCC), frei verteilbare Importbibliotheken und Header-Dateien zum Erstellen nativer Windows-Anwendungen, einschließlich Erweiterungen der MSVC-Laufzeit zur Unterstützung der C99-Funktionalität. Die gesamte MinGW-Software kann auf 64-Bit-Windows-Plattformen ausgeführt werden.

MantisBT
Mantis ist ein einfach zu implementierendes webbasiertes Tool zur Fehlerverfolgung, das die Fehlerverfolgung von Produkten unterstützen soll. Es erfordert PHP, MySQL und einen Webserver. Schauen Sie sich unsere Demo- und Hosting-Services an.