Heim > Web-Frontend > js-Tutorial > Vor TDD: Warum müssen Sie wissen, was Mocks, Stubs und Spies sind?

Vor TDD: Warum müssen Sie wissen, was Mocks, Stubs und Spies sind?

DDD
Freigeben: 2025-01-10 09:23:41
Original
170 Leute haben es durchsucht

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)
    }
})()
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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)
    }
})()
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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)
    }
})()
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

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!

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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage