0Pricing
Lua Academy · Lezione

Mock e spy

Isoli il codice sottoposto a test.

Mock e spy è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Test double

A volte una funzione dipende da qualcosa di lento o esterno, come una chiamata di rete o un logger. I test double sostituiscono queste dipendenze con sostituti controllabili.

busted ne fornisce tre tipi: spies, stubs e mocks. Ognuno risponde a un'esigenza diversa.

Cosa fa uno spy

Uno spy avvolge una funzione e registra come viene chiamata, continuando comunque a eseguire l'originale. Permette di verificare che qualcosa sia stato invocato.

Ne crei uno con spy.new attorno a una funzione oppure applichi uno spy a un campo di una tabella.

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

Monitoraggio di un metodo

Utilizzi spy.on per osservare un metodo di una tabella esistente. L'originale continua a essere eseguito, ma busted tiene traccia di ogni chiamata.

È ideale per confermare un effetto collaterale, ad esempio che sia stato chiamato un logger.

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

Controllo del numero di chiamate

Gli spy registrano quante volte sono stati chiamati. Utilizzi was.called(n) per verificare un numero esatto di chiamate.

Questo consente di individuare i bug in cui una funzione viene eseguita troppe volte o non viene eseguita affatto.

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

Controllo degli argomenti

Può verificare quali argomenti ha ricevuto uno spy utilizzando was.called_with. busted confronta gli argomenti registrati con l'aspettativa indicata.

In questo modo verifica non solo che una funzione sia stata eseguita, ma anche che sia stata eseguita correttamente.

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

Cosa fa uno stub

Uno stub sostituisce completamente una funzione, quindi l'originale non viene mai eseguita. Lo utilizzi per evitare operazioni lente o indesiderate, come l'accesso reale alla rete o al disco.

Ne crei uno con stub su un campo di una tabella. Per impostazione predefinita, lo stub non esegue alcuna operazione e restituisce nil.

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

Valori restituiti dagli stub

Può fare in modo che uno stub restituisca un valore fisso con returns. In questo modo fornisce dati controllati al codice sottoposto a test.

Ora il test non dipende affatto dalla dipendenza reale.

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

Cosa fa un mock

Un mock prende una tabella esistente e trasforma in una volta sola tutte le sue funzioni in spy o stub. È un modo pratico per tenere traccia di un intero oggetto.

Chiami mock(obj) per applicare il wrapper, quindi esegua le asserzioni sui singoli metodi.

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

Mock con metodi stub

Passando true come secondo argomento a mock, applica uno stub a ogni metodo, impedendo l'esecuzione degli originali. In questo modo l'oggetto viene isolato completamente.

Lo utilizzi quando i metodi reali producono effetti collaterali che deve evitare.

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

Ripristino dei test double

Spy, stub e mock modificano le tabelle condivise, quindi deve ripristinarli; altrimenti i test successivi vedranno il double. Chiami :revert() o mock.revert.

Inserisca il ripristino in after_each per garantire uno stato pulito tra un test e l'altro.

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

Scelta del test double corretto

Utilizzi uno spy per osservare una funzione reale, uno stub per sostituirla con un comportamento controllato e un mock per applicare un wrapper a un intero oggetto in una volta sola.

Preferisca il double più semplice che risolve il problema. Un uso eccessivo dei mock può rendere i test fragili e nascondere bug reali.

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)

Verifica rapida

Verifichi la sua comprensione dei test double di busted.

Riepilogo

I test double isolano il codice dalle dipendenze lente o esterne. Uno spy registra le chiamate eseguendo l'originale, uno stub sostituisce una funzione con un comportamento controllato e un mock applica un wrapper a un intero oggetto.

Esegua le asserzioni con was.called e was.called_with, e ripristini sempre i double con revert in after_each per mantenere isolati i test.

Domande Frequenti

La lezione «Mock e spy» è gratuita?

Sì — il testo completo di «Mock e spy» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «Mock e spy»?

Isoli il codice sottoposto a test. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Mock e spy»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Perché eseguire test
  2. Blocchi describe e it
  3. Asserzioni
  4. Mock e spy
← Torna a Lua Academy