0Pricing
Lua Academy · Leçon

Simulations et espions

Isolez le code testé.

Simulations et espions est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.

Doubles de test

Il arrive qu’une fonction dépende d’un élément lent ou externe, comme un appel réseau ou un système de journalisation. Les doubles de test remplacent ces dépendances par des substituts contrôlables.

busted en fournit trois types : les espions, les bouchons et les objets simulés. Chacun répond à un besoin différent.

Fonctionnement d’un espion

Un espion entoure une fonction et enregistre la manière dont elle est appelée tout en exécutant la fonction originale. Il vous permet de vérifier qu’un élément a bien été appelé.

Créez-en un avec spy.new autour d’une fonction, ou espionnez un champ de table.

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

Espionner une méthode

Utilisez spy.on pour surveiller une méthode d’une table existante. La fonction originale continue de s’exécuter, mais busted suit chaque appel.

C’est idéal pour confirmer un effet secondaire, comme l’appel d’un système de journalisation.

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

Vérifier le nombre d’appels

Les espions enregistrent le nombre de fois où ils ont été appelés. Utilisez was.called(n) pour vérifier un nombre exact d’appels.

Cela permet de détecter les bogues où une fonction s’exécute trop souvent ou jamais.

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

Vérifier les arguments d’appel

Vous pouvez vérifier les arguments reçus par un espion avec was.called_with. busted compare les arguments enregistrés à ceux que vous attendiez.

Cela vérifie non seulement qu’une fonction s’est exécutée, mais aussi qu’elle l’a fait correctement.

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

Fonctionnement d’un bouchon

Un bouchon remplace entièrement une fonction, de sorte que l’originale ne s’exécute jamais. Utilisez-le pour éviter un travail lent ou indésirable, comme un véritable accès au réseau ou au disque.

Créez-en un avec stub sur un champ de table. Par défaut, le bouchon ne fait rien et renvoie nil.

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

Valeurs renvoyées par un bouchon

Vous pouvez faire renvoyer une valeur fixe à un bouchon avec returns. Cela fournit des données contrôlées au code testé.

Votre test ne dépend alors plus du tout de la dépendance réelle.

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

Fonctionnement d’un objet simulé

Un objet simulé prend une table existante et transforme toutes ses fonctions en espions ou en bouchons à la fois. C’est une manière pratique de suivre un objet entier.

Appelez mock(obj) pour l’envelopper, puis vérifiez ses méthodes individuellement.

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

Objet simulé avec méthodes remplacées

En transmettant true comme deuxième argument à mock, vous remplacez toutes les méthodes par des bouchons, de sorte qu’aucune fonction originale ne s’exécute. L’objet est ainsi complètement isolé.

Utilisez cette approche lorsque les méthodes réelles ont des effets secondaires à éviter.

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

Restaurer les doubles

Les espions, les bouchons et les objets simulés modifient les tables partagées. Vous devez donc les restaurer, sinon les tests suivants verront le double. Appelez :revert() ou mock.revert.

Placez la restauration dans after_each pour garantir un état propre entre les tests.

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

Choisir le bon double

Utilisez un espion pour observer une fonction réelle, un bouchon pour la remplacer par un comportement contrôlé et un objet simulé pour envelopper un objet entier en une seule fois.

Privilégiez le double le plus simple qui répond au besoin. Une utilisation excessive des doubles peut rendre les tests fragiles et masquer de vrais bogues.

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)

Vérification rapide

Testez votre compréhension des doubles de test de busted.

Récapitulatif

Les doubles de test isolent le code des dépendances lentes ou externes. Un espion enregistre les appels tout en exécutant la fonction originale, un bouchon remplace une fonction par un comportement contrôlé et un objet simulé enveloppe un objet entier.

Utilisez was.called et was.called_with pour les vérifications, et restaurez toujours les doubles avec revert dans after_each afin de garder les tests isolés.

Questions Fréquemment Posées

La leçon « Simulations et espions » est-elle gratuite ?

Oui — le texte complet de « Simulations et espions » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Simulations et espions » ?

Isolez le code testé. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Lua Academy ?

Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « Simulations et espions » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?

Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Pourquoi tester
  2. Blocs describe et it
  3. Assertions
  4. Simulations et espions
← Retour à Lua Academy