Mocks y spies
Aísle el código sometido a prueba
Mocks y spies es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
Dobles de prueba
A veces una función depende de algo lento o externo, como una llamada de red o un registrador. Los dobles de prueba sustituyen esas dependencias por sustitutos controlables.
busted proporciona tres tipos: espías, stubs y mocks. Cada uno responde a una necesidad diferente.
Qué hace un espía
Un espía envuelve una función y registra cómo se la llama, pero sigue ejecutando la función original. Permite verificar que algo se haya invocado.
Cree uno con spy.new alrededor de una función o espíe un campo de una tabla.
local s = spy.new(function() end)
s(1, 2)
assert.spy(s).was.called()Espiar un método
Use spy.on para observar un método de una tabla existente. El original sigue ejecutándose, pero busted registra cada llamada.
Esto resulta ideal para confirmar un efecto secundario, como que se haya llamado a un registrador.
spy.on(logger, "info")
service.run()
assert.spy(logger.info).was.called()Comprobar el número de llamadas
Los espías registran cuántas veces se los ha llamado. Use was.called(n) para comprobar un número exacto de llamadas.
Esto detecta errores en los que una función se ejecuta demasiadas veces o no se ejecuta en absoluto.
assert.spy(s).was.called(2)
assert.spy(s).was_not.called()Comprobar los argumentos de las llamadas
Puede comprobar qué argumentos recibió un espía mediante was.called_with. busted compara los argumentos registrados con lo que esperaba.
Esto verifica no solo que una función se haya ejecutado, sino también que lo haya hecho correctamente.
local s = spy.new(function() end)
s("user", 42)
assert.spy(s).was.called_with("user", 42)Qué hace un stub
Un stub sustituye por completo una función, por lo que el original nunca se ejecuta. Úselo para omitir operaciones lentas o no deseadas, como acceder realmente a la red o al disco.
Cree uno con stub sobre un campo de una tabla. De forma predeterminada, el stub no hace nada y devuelve nil.
stub(api, "fetch")
service.load()
assert.stub(api.fetch).was.called()Valores de retorno de un stub
Puede hacer que un stub devuelva un valor fijo con returns. Así introduce datos controlados en el código que se está probando.
De este modo, la prueba no depende en absoluto de la dependencia real.
stub(api, "fetch").returns({id = 1})
local r = service.load()
assert.are.same({id = 1}, r)Qué hace un mock
Un mock toma una tabla existente y convierte todas sus funciones en espías o stubs de una sola vez. Es una forma práctica de realizar el seguimiento de un objeto completo.
Llame a mock(obj) para envolverlo y, después, compruebe cada método por separado.
local m = mock(realLogger)
app.start(m)
assert.spy(m.warn).was.called()Mock con métodos sustituidos
Pasar true como segundo argumento a mock crea un stub para cada método, por lo que ninguno de los originales se ejecuta. Así se aísla por completo el objeto.
Úselo cuando los métodos reales tengan efectos secundarios que deba evitar.
local db = mock(database, true)
db.query.returns({})
assert.are.same({}, repo.all())Restaurar los dobles
Los espías, stubs y mocks modifican tablas compartidas, por lo que debe restaurarlos; de lo contrario, las pruebas posteriores verán el doble. Llame a :revert() o a mock.revert.
Coloque la restauración en after_each para garantizar un estado limpio entre pruebas.
after_each(function()
mock.revert(m)
end)Elegir el doble adecuado
Use un espía para observar una función real, un stub para sustituirla por un comportamiento controlado y un mock para envolver un objeto completo de una sola vez.
Prefiera el doble más sencillo que resuelva el problema. Abusar de los mocks puede hacer que las pruebas sean frágiles y ocultar errores reales.
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)Comprobación rápida
Compruebe cuánto entiende de los dobles de prueba de busted.
Repaso
Los dobles de prueba aíslan el código de dependencias lentas o externas. Un espía registra las llamadas mientras ejecuta el original, un stub sustituye una función por un comportamiento controlado y un mock envuelve un objeto completo.
Realice comprobaciones con was.called y was.called_with, y restaure siempre los dobles con revert en after_each para mantener las pruebas aisladas.
Preguntas frecuentes
¿La lección «Mocks y spies» es gratis?
Sí — el texto completo de «Mocks y spies» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Mocks y spies»?
Aísle el código sometido a prueba Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Mocks y spies»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Por qué hacer pruebas
- Bloques describe e it
- Aserciones
- Mocks y spies