0Pricing
Lua Academy · Lektion

Mocks und Spies

Isolieren Sie den getesteten Code.

Mocks und Spies ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Test-Doubles

Manchmal hängt eine Funktion von etwas Langsamem oder Externem ab, etwa einem Netzwerkaufruf oder einem Logger. Test-Doubles ersetzen solche Abhängigkeiten durch kontrollierbare Ersatzobjekte.

busted stellt drei Arten bereit: spies, stubs und mocks. Jede Art erfüllt einen anderen Zweck.

Was ein Spy tut

Ein Spy umschließt eine Funktion und protokolliert, wie sie aufgerufen wird, während die ursprüngliche Funktion weiterhin ausgeführt wird. So können Sie überprüfen, ob etwas aufgerufen wurde.

Erstellen Sie einen Spy mit spy.new um eine Funktion herum oder überwachen Sie ein Tabellenfeld.

local s = spy.new(function() end)
s(1, 2)
assert.spy(s).was.called()

Eine Methode überwachen

Verwenden Sie spy.on, um eine Methode einer vorhandenen Tabelle zu überwachen. Die ursprüngliche Methode wird weiterhin ausgeführt, aber busted erfasst jeden Aufruf.

Das ist ideal, um einen Seiteneffekt zu bestätigen, etwa dass ein Logger aufgerufen wird.

spy.on(logger, "info")
service.run()
assert.spy(logger.info).was.called()

Aufrufanzahlen prüfen

Spies erfassen, wie oft sie aufgerufen wurden. Verwenden Sie was.called(n), um eine exakte Anzahl zu prüfen.

So erkennen Sie Fehler, bei denen eine Funktion zu oft oder überhaupt nicht ausgelöst wird.

assert.spy(s).was.called(2)
assert.spy(s).was_not.called()

Aufrufargumente prüfen

Mit was.called_with können Sie prüfen, welche Argumente ein Spy erhalten hat. busted vergleicht die aufgezeichneten Argumente mit Ihrer Erwartung.

Damit prüfen Sie nicht nur, ob eine Funktion ausgeführt wurde, sondern auch, ob sie korrekt ausgeführt wurde.

local s = spy.new(function() end)
s("user", 42)
assert.spy(s).was.called_with("user", 42)

Was ein Stub tut

Ein Stub ersetzt eine Funktion vollständig, sodass die ursprüngliche Funktion niemals ausgeführt wird. Verwenden Sie ihn, um langsame oder unerwünschte Vorgänge wie echte Netzwerk- oder Festplattenzugriffe zu überspringen.

Erstellen Sie einen Stub mit stub für ein Tabellenfeld. Standardmäßig tut der Stub nichts und gibt nil zurück.

stub(api, "fetch")
service.load()
assert.stub(api.fetch).was.called()

Rückgabewerte von Stubs

Mit returns können Sie einen Stub so konfigurieren, dass er einen festen Wert zurückgibt. Dadurch erhält der getestete Code kontrollierte Daten.

Ihr Test hängt dann überhaupt nicht mehr von der echten Abhängigkeit ab.

stub(api, "fetch").returns({id = 1})
local r = service.load()
assert.are.same({id = 1}, r)

Was ein Mock tut

Ein Mock nimmt eine vorhandene Tabelle und macht alle ihre Funktionen auf einmal zu Spies oder Stubs. So lässt sich ein ganzes Objekt bequem überwachen.

Rufen Sie mock(obj) auf, um die Tabelle zu umschließen, und prüfen Sie anschließend einzelne Methoden.

local m = mock(realLogger)
app.start(m)
assert.spy(m.warn).was.called()

Mock mit gestubbten Methoden

Wenn Sie true als zweites Argument an mock übergeben, werden alle Methoden gestubbt, sodass keine der ursprünglichen Methoden ausgeführt wird. Dadurch wird das Objekt vollständig isoliert.

Verwenden Sie dies, wenn die echten Methoden Seiteneffekte haben, die Sie vermeiden müssen.

local db = mock(database, true)
db.query.returns({})
assert.are.same({}, repo.all())

Test-Doubles wiederherstellen

Spies, Stubs und Mocks verändern gemeinsam genutzte Tabellen. Sie müssen sie daher wiederherstellen, sonst sehen spätere Tests das Double. Rufen Sie :revert() oder mock.revert auf.

Führen Sie die Wiederherstellung in after_each durch, um zwischen den Tests einen sauberen Zustand zu gewährleisten.

after_each(function()
  mock.revert(m)
end)

Das richtige Double wählen

Verwenden Sie einen Spy, um eine echte Funktion zu beobachten, einen Stub, um sie durch ein kontrolliertes Verhalten zu ersetzen, und einen Mock, um ein ganzes Objekt auf einmal zu umschließen.

Bevorzugen Sie das einfachste Double, das seinen Zweck erfüllt. Übermäßiges Mocking kann Tests anfällig machen und echte Fehler verbergen.

describe("mailer", function()
  it("sends once", function()
    local s = spy.on(smtp, "send")
    mailer.notify("a@b.com")
    assert.spy(s).was.called(1)
  end)
end)

Schnelltest

Testen Sie Ihr Verständnis von busted-Test-Doubles.

Zusammenfassung

Test-Doubles isolieren Code von langsamen oder externen Abhängigkeiten. Ein spy zeichnet Aufrufe auf und führt dabei die ursprüngliche Funktion aus, ein stub ersetzt eine Funktion durch ein kontrolliertes Verhalten und ein mock umschließt ein ganzes Objekt.

Prüfen Sie Aufrufe mit was.called und was.called_with und stellen Sie Doubles immer mit revert in after_each wieder her, damit die Tests isoliert bleiben.

Häufig gestellte Fragen

Ist die Lektion „Mocks und Spies“ kostenlos?

Ja — der vollständige Text von „Mocks und Spies“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Mocks und Spies“?

Isolieren Sie den getesteten Code. Du übst Lua Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „Mocks und Spies“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Warum testen
  2. describe- und it-Blöcke
  3. Assertions
  4. Mocks und Spies
← Zurück zu Lua Academy