suchen
HeimWeb-Frontendjs-TutorialVor TDD: Warum müssen Sie wissen, was Mocks, Stubs und Spies sind?

Before TDD: Why you need to know what Mocks, Stubs, and Spies are?

Hallo zusammen! Heute bringe ich ein Thema vor, das meiner Meinung nach sehr interessant ist. Ich weiß, dass es online Dutzende von Artikeln gibt, die sich mit TDD, BDD, Entwurfsmustern für Tests, dem Schreiben von Tests und vielen anderen verwandten Themen befassen. Allerdings sehe ich nur sehr wenige Artikel, die grundlegendere Begriffe im Testuniversum erklären – jene Funktionen, die wir häufig verwenden, von denen wir jedoch nicht immer vollständig verstehen, was sie bedeuten oder wie sie sich verhalten. Wenn Sie gerade erst anfangen, etwas über das Testen zu lernen, und nicht genau wissen, was die Bibliotheksfunktionen bewirken, ist dieser Artikel genau das Richtige für Sie. Viel Spaß beim Lesen!

Was sind Mocks?

Das Erste, worauf Sie stoßen könnten, sobald Sie mit dem Schreiben von Tests beginnen, sind Mocks. Manchmal verwendet man sie bereits, weiß aber nicht genau, was sie bedeuten. Also, lasst uns eintauchen.

Mocks werden hauptsächlich beim Unit-Testen verwendet. Hierbei handelt es sich um Tools zur Simulation von Inhalten, Objekten oder Antworten, die normalerweise aus einer externen Abhängigkeit stammen oder wenn der Inhalt bestimmte Informationen enthalten muss.

Stellen Sie sich vor, Sie testen ein Filmempfehlungssystem. Dieses System ruft eine Liste von Filmen von einer API ab und sendet sie an Sie zurück.

Das Problem ist: Wenn jedes Mal, wenn Sie die Tests ausführen, die echte API aufgerufen wird, könnte diese langsam und inkonsistent sein (Filme können variieren oder die API könnte ausfallen), was die Tests unzuverlässig macht.

Okay, Leo, ich verstehe das Problem, aber wie löst ein Mock das? Nun, es ist ganz einfach: Anstatt die API aufzurufen, verwenden Sie deren Antwort als statische Liste von Filmen. Es handelt sich im Grunde genommen um eine „Fälschung“ der API-Antwort mit dieser Filmliste.

Wenn Sie im Beispiel des Filmsystems eine Funktion namens fetchMoviesFromAPI() testen möchten, die die API zum Abrufen von Filmen verwendet, können Sie eine Simulation erstellen, um die API-Antwort wie folgt zu simulieren:

// This is the mock
const MOVIES_FROM_API = [
    {
        id: 1,
        name: "Interstellar"
    },
    {
        id: 2,
        name: "Nosferatu"
    }
]

// Here, we’re telling fetchMoviesFromAPI to return our mock instead of calling the real API. This is a stub, which you’ll learn about in the next section.
const fetchMoviesFromAPI = jest.fn().mockResolvedValue(MOVIES_FROM_API)

;(async () => {
    {
        const expectedMovies = MOVIES_FROM_API
        const movies = await fetchMoviesFromAPI()

        expect(movies).toEqual(MOVIES_FROM_API)
    }
})()

Mit Mocks werden Ihre Tests effizienter, da sie nicht von externen Diensten abhängig sind. Darüber hinaus gewinnen sie an Zuverlässigkeit, da Sie die volle Kontrolle über die Erträge haben, sodass Sie sich weiterhin auf die Validierung der Funktionalität konzentrieren können, ohne sich über mögliche API-Instabilitäten oder Ausfallzeiten Gedanken machen zu müssen.

Mocks sind statische Objekte, die Antworten von Anrufen oder anderen zum Testen benötigten Objekten simulieren.

Letztendlich ist es so, als würde man ein Auto testen, ohne echtes Benzin zu verwenden. Sie schaffen eine kontrollierte Umgebung, um sicherzustellen, dass der Motor funktioniert, bevor Sie ihn auf die Straße bringen.

Ich bekomme Mocks, was sind nun Stubs?

Stubs sind ebenfalls Testwerkzeuge, dienen aber einem etwas anderen Zweck. Sie ersetzen das Verhalten von Funktionen durch etwas Vorgegebenes und verwenden oft Mocks, um bestimmte Werte zurückzugeben.

Stubs ersetzen das Verhalten der Funktion. Wenn ich beispielsweise auf diese Film-API zugreife, führt die Funktion nicht den eigentlichen Aufruf aus, sondern schaut sich unser Mock (die statische Liste der Filme) an.

Sie dienen auch als Erinnerung daran, dass unsere Tests nicht von externen Diensten oder dem Internet abhängig sein sollten.

Lassen Sie mich Ihnen etwas Kontext geben: Stellen Sie sich vor, Sie testen eine Anwendung, die den Gesamtwert eines Online-Kaufs berechnet. Die Berechnung berücksichtigt Gebühren, die von einem externen Dienst erhoben werden. Jedes Mal, wenn Sie den Test ausführen, muss diese Berechnung durchgeführt werden, was bedeutet, dass der externe Dienst aufgerufen werden muss. Dies könnte zu einem langsamen, instabilen, kostspieligen (da der externe Dienst möglicherweise Gebühren pro Anfrage berechnet) und inkonsistenten Test (Werte könnten sich ändern) führen.

Mit einem Stub ersetzen Sie den echten Serviceaufruf durch einen festen, vordefinierten Wert (ja, einen Schein). Anstatt den Gebührenservice anzurufen, sagen Sie: „Als Gebühr immer den Wert 10 zurückgeben.“

Stellen Sie sich vor, Sie möchten die Funktion berechnenTotalPurchase() testen, die die Werte der Warenkorbartikel summiert und die Versandkosten hinzufügt. Mithilfe von Stubs ersetzen Sie den Versandkostenservice durch einen Wert, der als Versandkosten immer „10“ zurückgibt. So:

// This is the mock
const MOVIES_FROM_API = [
    {
        id: 1,
        name: "Interstellar"
    },
    {
        id: 2,
        name: "Nosferatu"
    }
]

// Here, we’re telling fetchMoviesFromAPI to return our mock instead of calling the real API. This is a stub, which you’ll learn about in the next section.
const fetchMoviesFromAPI = jest.fn().mockResolvedValue(MOVIES_FROM_API)

;(async () => {
    {
        const expectedMovies = MOVIES_FROM_API
        const movies = await fetchMoviesFromAPI()

        expect(movies).toEqual(MOVIES_FROM_API)
    }
})()

Dies vereinfacht den Test und gewährleistet seine Reproduzierbarkeit, sodass er immer auf die gleiche Weise funktioniert. Darüber hinaus helfen Stubs dabei, den Test zu isolieren, sodass Sie sich keine Gedanken über den Status oder die Verfügbarkeit der Gebühren-API machen müssen.

Zusammenfassend lässt sich sagen, dass es so ist, als würde man ein Kuchenrezept mit einem Messbecher testen, auf dem immer 200 ml Milch stehen, anstatt die tatsächliche Milchmenge abzumessen. Auf diese Weise testen Sie nur, ob Sie die Zutaten mischen können, ohne sich Gedanken darüber machen zu müssen, ob die Milch richtig abgemessen wird.

Spott, Stubs ... und schließlich: Was sind Spione?

Wir haben Mocks untersucht, die Objekte simulieren, und Stubs, die Funktionsverhalten nachahmen. Lassen Sie uns nun über Spione sprechen: Was genau machen sie?

Spies überwachen Funktionen und zeichnen auf, wie oft sie aufgerufen wurden, welche Parameter sie erhielten und die Ergebnisse jeder Ausführung. Sie ermöglichen es Ihnen, das Verhalten der Funktion zu beobachten, ohne sie zu ändern, und stellen so sicher, dass alles wie erwartet funktioniert.

Stellen Sie sich vor, Sie testen das Benachrichtigungsmodul Ihres Projekts. Jedes Mal, wenn eine Bestellung abgeschlossen ist, sollte das System eine Nachricht an den Kunden senden und einen Eintrag protokollieren. In diesem Fall möchten Sie nur sicherstellen, dass diese Aktionen ausgeführt werden, aber keine davon ersetzen. Mit einem Spion überwachen Sie diese Funktionen, ohne ihr Verhalten zu ändern. Dadurch können Sie Folgendes sehen:

  • Wenn die Funktion aufgerufen wurde
  • Wie oft wurde es aufgerufen
  • Welche Argumente es erhalten hat

Wenn Sie beispielsweise die Funktion „completeOrder()“, die eine Benachrichtigung an den Kunden sendet und den Eintrag protokolliert, mit einem Spion testen möchten, können Sie Folgendes überprüfen:

  • Wenn die Benachrichtigungsfunktion aufgerufen wurde
  • Wenn die Protokollfunktion aufgerufen wurde
  • Welche Argumente diese Funktionen erhalten haben.
// This is the mock
const MOVIES_FROM_API = [
    {
        id: 1,
        name: "Interstellar"
    },
    {
        id: 2,
        name: "Nosferatu"
    }
]

// Here, we’re telling fetchMoviesFromAPI to return our mock instead of calling the real API. This is a stub, which you’ll learn about in the next section.
const fetchMoviesFromAPI = jest.fn().mockResolvedValue(MOVIES_FROM_API)

;(async () => {
    {
        const expectedMovies = MOVIES_FROM_API
        const movies = await fetchMoviesFromAPI()

        expect(movies).toEqual(MOVIES_FROM_API)
    }
})()

Zusammenfassend lässt sich sagen, dass es so ist, als würde man eine Kamera aufstellen, um zu beobachten, was ein Koch in der Küche tut. Sie mischen sich nicht in das ein, was sie tun. Überprüfen Sie einfach, ob das Rezept korrekt befolgt wird.

So, das ist es! Sie haben die Begriffe Mocks, Stubs und Spione gelernt und verstanden, die grundlegende Elemente für die Erstellung zuverlässiger und effizienter Tests sind. Jetzt können Sie Ihr Studium weiter vertiefen. Wir sehen uns dort, auf Wiedersehen!

Das obige ist der detaillierte Inhalt vonVor TDD: Warum müssen Sie wissen, was Mocks, Stubs und Spies sind?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme
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
Python vs. JavaScript: Auswählen des richtigen Tools für den JobPython vs. JavaScript: Auswählen des richtigen Tools für den JobMay 08, 2025 am 12:10 AM

Ob die Auswahl von Python oder JavaScript vom Projekttyp abhängt: 1) Wählen Sie Python für Datenwissenschafts- und Automatisierungsaufgaben aus; 2) Wählen Sie JavaScript für die Entwicklung von Front-End- und Full-Stack-Entwicklung. Python ist für seine leistungsstarke Bibliothek in der Datenverarbeitung und -automatisierung bevorzugt, während JavaScript für seine Vorteile in Bezug auf Webinteraktion und Full-Stack-Entwicklung unverzichtbar ist.

Python und JavaScript: Verständnis der Stärken der einzelnenPython und JavaScript: Verständnis der Stärken der einzelnenMay 06, 2025 am 12:15 AM

Python und JavaScript haben jeweils ihre eigenen Vorteile, und die Wahl hängt von den Projektbedürfnissen und persönlichen Vorlieben ab. 1. Python ist leicht zu erlernen, mit prägnanter Syntax, die für Datenwissenschaft und Back-End-Entwicklung geeignet ist, aber eine langsame Ausführungsgeschwindigkeit hat. 2. JavaScript ist überall in der Front-End-Entwicklung und verfügt über starke asynchrone Programmierfunktionen. Node.js macht es für die Entwicklung der Vollstapel geeignet, die Syntax kann jedoch komplex und fehleranfällig sein.

JavaScripts Kern: Ist es auf C oder C aufgebaut?JavaScripts Kern: Ist es auf C oder C aufgebaut?May 05, 2025 am 12:07 AM

JavaScriptisnotbuiltoncorc; Es ist angehört, dass sich JavaScriptWasdedeSthatrunsonGineoFtencninc.

JavaScript-Anwendungen: Von Front-End bis Back-EndJavaScript-Anwendungen: Von Front-End bis Back-EndMay 04, 2025 am 12:12 AM

JavaScript kann für die Entwicklung von Front-End- und Back-End-Entwicklung verwendet werden. Das Front-End verbessert die Benutzererfahrung durch DOM-Operationen, und die Back-End-Serveraufgaben über node.js. 1. Beispiel für Front-End: Ändern Sie den Inhalt des Webseitentextes. 2. Backend Beispiel: Erstellen Sie einen Node.js -Server.

Python vs. JavaScript: Welche Sprache sollten Sie lernen?Python vs. JavaScript: Welche Sprache sollten Sie lernen?May 03, 2025 am 12:10 AM

Die Auswahl von Python oder JavaScript sollte auf Karriereentwicklung, Lernkurve und Ökosystem beruhen: 1) Karriereentwicklung: Python ist für die Entwicklung von Datenwissenschaften und Back-End-Entwicklung geeignet, während JavaScript für die Entwicklung von Front-End- und Full-Stack-Entwicklung geeignet ist. 2) Lernkurve: Die Python -Syntax ist prägnant und für Anfänger geeignet; Die JavaScript -Syntax ist flexibel. 3) Ökosystem: Python hat reichhaltige wissenschaftliche Computerbibliotheken und JavaScript hat ein leistungsstarkes Front-End-Framework.

JavaScript -Frameworks: Stromversorgung moderner WebentwicklungJavaScript -Frameworks: Stromversorgung moderner WebentwicklungMay 02, 2025 am 12:04 AM

Die Kraft des JavaScript -Frameworks liegt in der Vereinfachung der Entwicklung, der Verbesserung der Benutzererfahrung und der Anwendungsleistung. Betrachten Sie bei der Auswahl eines Frameworks: 1. Projektgröße und Komplexität, 2. Teamerfahrung, 3. Ökosystem und Community -Unterstützung.

Die Beziehung zwischen JavaScript, C und BrowsernDie Beziehung zwischen JavaScript, C und BrowsernMay 01, 2025 am 12:06 AM

Einführung Ich weiß, dass Sie es vielleicht seltsam finden. Was genau muss JavaScript, C und Browser tun? Sie scheinen nicht miteinander verbunden zu sein, aber tatsächlich spielen sie eine sehr wichtige Rolle in der modernen Webentwicklung. Heute werden wir die enge Verbindung zwischen diesen drei diskutieren. In diesem Artikel erfahren Sie, wie JavaScript im Browser ausgeführt wird, die Rolle von C in der Browser -Engine und wie sie zusammenarbeiten, um das Rendern und die Interaktion von Webseiten voranzutreiben. Wir alle kennen die Beziehung zwischen JavaScript und Browser. JavaScript ist die Kernsprache der Front-End-Entwicklung. Es läuft direkt im Browser und macht Webseiten lebhaft und interessant. Haben Sie sich jemals gefragt, warum Javascr

Node.js Streams mit TypeScriptNode.js Streams mit TypeScriptApr 30, 2025 am 08:22 AM

Node.js zeichnet sich bei effizienten E/A aus, vor allem bei Streams. Streams verarbeiten Daten inkrementell und vermeiden Speicherüberladung-ideal für große Dateien, Netzwerkaufgaben und Echtzeitanwendungen. Die Kombination von Streams mit der TypeScript -Sicherheit erzeugt eine POWE

See all articles

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SAP NetWeaver Server-Adapter für Eclipse

SAP NetWeaver Server-Adapter für Eclipse

Integrieren Sie Eclipse mit dem SAP NetWeaver-Anwendungsserver.

mPDF

mPDF

mPDF ist eine PHP-Bibliothek, die PDF-Dateien aus UTF-8-codiertem HTML generieren kann. Der ursprüngliche Autor, Ian Back, hat mPDF geschrieben, um PDF-Dateien „on the fly“ von seiner Website auszugeben und verschiedene Sprachen zu verarbeiten. Es ist langsamer und erzeugt bei der Verwendung von Unicode-Schriftarten größere Dateien als Originalskripte wie HTML2FPDF, unterstützt aber CSS-Stile usw. und verfügt über viele Verbesserungen. Unterstützt fast alle Sprachen, einschließlich RTL (Arabisch und Hebräisch) und CJK (Chinesisch, Japanisch und Koreanisch). Unterstützt verschachtelte Elemente auf Blockebene (wie P, DIV),

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung