L'API d'Escena Viva ven entrades, persisteix comandes amb transaccions que impedeixen la sobrevenda, autentica usuaris, rota tokens de refresc i autoritza operacions segons rols i propietat del recurs. Fa moltíssimes coses. I ningú no ha comprovat mai que funcioni. Ni una sola vegada.
npm test continua fallant a propòsit des del mòdul 5 amb el missatge Sense proves encara — Modul 9, i cada línia de seguretat que vam escriure al mòdul anterior —el hash esquer de bcrypt, la detecció de reutilització del refresc, cada cel·la de la matriu de permisos— descansa avui sobre la confiança que la vam escriure bé. Un if invertit a potGestionarEsdeveniment obriria el catàleg sencer d'esdeveniments a qualsevol organitzador i res no ens n'avisaria.
En aquesta lliçó encara no escriurem la primera prova executable ni instal·larem res: això és la lliçó següent. Aquí construïm els fonaments conceptuals, que és el que separa un projecte amb moltes proves d'un projecte amb bones proves.
Contingut
- Per què es prova: canviar el codi sense por
- Què és una prova automatitzada i l'estructura AAA
- Tipus de prova i la piràmide
- Què s'ha de provar i què no: el criteri del risc
- Què fa bona una prova
- Proves fràgils i falsos positius
- TDD explicat amb honestedat
- El panorama d'eines per a Node
- El pla de proves d'Escena Viva
Per què es prova: canviar el codi sense por
Hi ha una idea molt estesa que les proves serveixen «per si de cas», com una assegurança que potser algun dia es cobrarà. És una descripció pobra i explica per què tants equips les abandonen al cap de tres setmanes. El valor real d'una bateria de proves és un altre i és mesurable en el dia a dia: et retorna la capacitat de modificar el codi.
Fem la prova del cotó fluix amb el nostre propi projecte. Respon amb honestedat:
- T'atreviries avui a reescriure
comprarEntradesper agrupar diverses sessions en una sola comanda? - T'atreviries a refactoritzar
PERMISOS_PER_ROLper afegir el roltaquillersense revisar manualment les 30 combinacions? - T'atreviries a canviar l'ordre de dos middlewares a
crearAplicacioperquèautenticars'executi abans quelimitCompra? - T'atreviries a pujar la versió major de Mongoose?
Si la resposta honesta és «no, o només amb molta cura i provant a mà al navegador», el codi ja t'està governant a tu. Aquesta paràlisi té un cost que no apareix en cap factura: les funcions es van copiant en comptes de reutilitzar-se, els if s'acumulen perquè ningú no esborra branques antigues, i el deute tècnic creix perquè tocar el que ja funciona fa por.
Una bateria de proves converteix la pregunta «hauré trencat alguna cosa?» en una ordre de deu segons. Aquest és el producte que comprem en aquest mòdul. Els beneficis secundaris són reals però secundaris:
| Benefici | Què aporta de veritat |
|---|---|
| Detectar regressions | Una fallada que ja vas arreglar no torna sense que te n'assabentis |
| Documentació viva | it('rebutja la venda si l aforament es insuficient') no es desactualitza, perquè si menteix falla |
| Pressió de disseny | El codi difícil de provar sol estar mal acoblat; provar-lo ho revela aviat |
| Confiança en el desplegament | CI pot bloquejar un desplegament trencat sense intervenció humana |
| Incorporació | Qui arriba nou llegeix les proves per entendre el comportament esperat |
I hi ha una cosa que les proves no fan, i convé dir-ho des del principi: no demostren que el programa sigui correcte. Demostren que els casos que se't van acudir es comporten com esperaves. És moltíssim, però no és una garantia matemàtica.
Què és una prova automatitzada i l'estructura AAA
Una prova automatitzada és senzillament un programa que executa un altre programa i comprova el resultat, i que acaba amb èxit o amb error sense que ningú miri la pantalla. No hi ha màgia: un fitxer de proves és JavaScript normal.
L'estructura universal es coneix com a AAA (Arrange, Act, Assert), que en català anomenarem preparar, actuar i comprovar:
- Preparar: construir l'escenari. Dades, objectes, dobles de prova, estat inicial.
- Actuar: executar exactament una operació, la que s'està provant.
- Comprovar: verificar que el resultat observable és l'esperat.
Vegem el primer exemple sobre una peça real del nostre domini, Sessio.vendre(). Encara no és codi executable amb Mocha —falta la instal·lació—, però l'anatomia ja és la definitiva:
// Esbos conceptual d'una prova sobre Sessio.vendre()
// (la sintaxi executable amb Mocha i Chai arriba a 09-02)
const { Sessio } = require('../../src/domini/sessio.js');
function provaVendreDescomptaDeLAforament() {
// 1. PREPARAR: una sessio coneguda i controlada
const sessio = new Sessio({
id: 'ses-001-1',
esdevenimentId: 'evt-001',
inici: '2026-10-17T20:00:00.000Z',
aforament: 400,
venudes: 100,
preuCentims: 2500,
});
// 2. ACTUAR: una sola operacio
sessio.vendre(3);
// 3. COMPROVAR: l'efecte observable
if (sessio.lliures !== 297) {
throw new Error("S'esperaven 297 localitats lliures");
}
}Tres observacions importants sobre aquest esbós:
- La preparació és explícita i local. No llegim la sessió de la base de dades ni depenem de la llavor. Si demà algú canvia l'aforament de
ses-001-1ascripts/llavor.js, aquesta prova continua sent vàlida. Una prova que depèn de dades llunyanes és una prova que fallarà per motius aliens al que diu que prova. - Actuar és una sola línia. Si necessites cinc crides per actuar, probablement estiguis provant cinc coses i la fallada no et dirà quina.
- Comprovem el comportament observable,
lliures, no el camp privat#venudes. De fet no podríem: és privat. Això és un avantatge, no un obstacle.
Un quart pas implícit, la neteja, apareixerà quan hi hagi recursos per alliberar (connexions, rellotges falsos, fitxers). Al domini pur no cal, i aquest és justament el seu encant.
Tipus de prova i la piràmide
No totes les proves costen el mateix ni detecten el mateix. Aquesta taula és el mapa del mòdul sencer:
| Tipus | Què exercita | Velocitat | Cost d'escriptura | Fragilitat | Què detecta |
|---|---|---|---|---|---|
| Unitària | Una funció o classe aïllada | Mil·lisegons | Baix | Baixa | Errors de lògica i de càlcul |
| Integració | Diverses peces juntes (rutes + middleware + repositori + BD) | Dècimes a segons | Mitjà | Mitjana | Cablatge, contractes entre capes, ordre de middlewares |
| Extrem a extrem | El sistema complet amb navegador o client real | Segons a minuts | Alt | Alta | Fluxos d'usuari complets, problemes de desplegament |
| De contracte | El format acordat entre dos serveis | Ràpida | Mitjà | Baixa | Canvis d'API que trencarien un consumidor |
| De càrrega | El sistema sota pressió | Minuts | Alt | Alta | Colls d'ampolla, degradació, límits de recursos |
Les tres primeres formen la piràmide de proves: moltes unitàries a la base, bastants d'integració al mig, molt poques d'extrem a extrem a la punta.
graph TD
E2E["Extrem a extrem<br/>poques · lentes · fragils<br/>fluxos critics de compra"]
INT["Integracio<br/>bastants · mitjanes<br/>rutes, middleware, repositoris, BD"]
UNI["Unitaries<br/>moltes · rapidissimes · estables<br/>domini, politica, utilitats"]
E2E --> INT
INT --> UNI
style E2E fill:#f8d7da,stroke:#842029
style INT fill:#fff3cd,stroke:#664d03
style UNI fill:#d1e7dd,stroke:#0f5132
La forma no és un caprici estètic: és economia. Una prova unitària de potGestionarEsdeveniment triga menys d'un mil·lisegon i, quan falla, t'assenyala una funció concreta. Una prova d'extrem a extrem del mateix permís triga deu segons, pot fallar perquè el navegador ha trigat a carregar, i quan falla et diu «el botó no apareixia», que pot significar cinquanta coses diferents.
L'antipatró del con de gelat
Quan un equip inverteix la piràmide —moltíssimes proves d'extrem a extrem, algunes d'integració, gairebé cap d'unitària— obté l'anomenat con de gelat. És un desastre reconeixible pels seus símptomes:
- La bateria triga 40 minuts i la gent deixa d'executar-la en local.
- Un canvi d'una línia en una plantilla trenca trenta proves.
- Apareixen proves intermitents (flaky): fallen una de cada cinc vegades sense motiu aparent.
- Com que fallen sovint per soroll, l'equip comença a reintentar fins que passin. En aquell moment la bateria ha deixat d'aportar informació i només aporta espera.
La regla pràctica: cada comportament es prova al nivell més baix que pugui demostrar-lo. Puja de nivell només quan el nivell inferior no pot veure el problema.
Què s'ha de provar i què no: el criteri del risc
Provar-ho tot és impossible i perseguir-ho produeix bateries cares que envelleixen malament. El criteri que farem servir és el risc, entès com a probabilitat de fallada multiplicada pel dany que causaria.
Sí que es prova:
- Lògica de negoci amb regles.
Sessio.vendre()valida quantitat, aforament i estat. Si s'equivoca, venem entrades que no existeixen. - La matriu de permisos. Un error aquí és una bretxa de seguretat silenciosa.
- Càlculs. Totals en cèntims, límits de 6 entrades per comanda, ocupació, llindar d'aforament baix.
- La gestió d'errors. Que
RecursNoTrobatacabi sent un 404 amb el format{ error: { codi, missatge, estat, detalls } }. - Casos límit i de frontera. Vendre exactament les últimes entrades, vendre'n una més, quantitat zero, quantitat negativa.
- Tota fallada que hagi passat en producció. Abans d'arreglar-la, una prova que la reprodueixi. Hi tornarem a 09-06.
No es prova (o es prova molt poc):
- Getters trivials. Si
get preuEuros() { return this.preuCentims / 100; }mereix una prova és discutible; si tingués arrodoniment, sí, perquè aleshores hi ha una decisió. - Biblioteques de tercers. No és feina teva comprovar que Express enruta o que bcrypt fa el hash. Sí que ho és comprovar com les fas servir.
- Configuració estàtica. Que
PERMISOStingui cinc claus no diu res; que un rol pugui o no usar-les, sí. - Detalls d'implementació. Que un mètode cridi internament un altre mètode privat no és un comportament; és una decisió que vols poder canviar.
- Codi generat. Migracions autogenerades, fitxers d'arrencada trivials.
Què fa bona una prova
Quatre propietats, en ordre d'importància:
- Ràpida. Si la bateria unitària triga més d'uns quants segons, deixaràs d'executar-la mentre programes.
- Determinista. El mateix codi amb la mateixa entrada dona sempre el mateix resultat. Res de
Date.now(),Math.random(), xarxa o dependència de l'ordre. Tot això ho domesticarem amb Sinon a 09-03. - Aïllada. No depèn que una altra prova s'hagi executat abans ni deixa residus per a la següent.
- Amb un sol motiu de fallada. Quan es posa vermella, ha de quedar clar quin comportament s'ha trencat.
I una cinquena que no és tècnica però decideix si la bateria sobreviu: el nom ha de descriure el comportament esperat, no el mètode invocat. El nom és l'única cosa que veuràs a la sortida quan falli a les tres de la matinada.
| Nom dolent | Per què és dolent | Nom bo |
|---|---|---|
prova vendre |
No diu què s'espera | descompta les localitats venudes de l aforament disponible |
test 1 |
No diu absolutament res | llanca ConflicteDEstat si no queden localitats suficients |
funciona |
No és falsable | marca la sessio com a exhaurida en vendre l ultima entrada |
politica |
Massa ampli | permet a l organitzador de la sala editar el seu propi esdeveniment |
no falla |
Absència d'error no és comportament | retorna 422 si es demanen mes de 6 entrades |
cas 3 del tiquet 481 |
El tiquet desapareixerà | impedeix que un assistent vegi la comanda d un altre assistent |
Fixa't que tots els noms bons comencen per un verb en tercera persona i descriuen l'efecte observable. Llegits al costat del describe que els conté formen una frase: Sessio vendre — llanca ConflicteDEstat si no queden localitats suficients.
Proves fràgils i falsos positius
Hi ha dos defectes de qualitat que arruïnen bateries senceres.
Prova fràgil és la que es trenca quan el codi canvia sense que el comportament canviï. Gairebé sempre neix de provar la implementació en comptes del comportament:
// FRAGIL: comprova com esta fet per dins.
// Si dema el gestor calcula el total amb reduce en lloc d'un bucle,
// aquesta prova falla sense que res s'hagi trencat per a l'usuari.
prova('gestor crida calcularSubtotal una vegada per linia', () => {
const espia = espiarMetodePrivat(gestor, 'calcularSubtotal');
gestor.registrarVenda(comanda);
comprovar(espia.crides === 2);
});
// ROBUST: comprova que s'obte
prova('el total de la comanda suma el preu de totes les seves linies', () => {
const comanda = gestor.registrarVenda({ linies: [
{ quantitat: 2, preuCentims: 2500 },
{ quantitat: 1, preuCentims: 1800 },
] });
comprovar(comanda.totalCentims === 6800);
});Fals positiu (o fals verd) és la prova que passa sempre, fins i tot amb el codi trencat. És pitjor que no tenir prova, perquè genera confiança infundada. Les causes més habituals a Node:
- Una promesa no esperada: l'
itacaba abans que l'asserció s'executi. Ho veurem en detall a 09-02. - Una asserció dins d'un
catchque no s'executa mai. - Simular tant la dependència que la prova només comprova les teves pròpies suposicions (el perill central de 09-03).
Truc professional que farem servir diverses vegades al mòdul: quan escriguis una prova, trenca-la a propòsit. Canvia un signe al codi de producció i comprova que es posa vermella. Una prova que mai no has vist fallar no és una prova, és una esperança.
TDD explicat amb honestedat
El desenvolupament dirigit per proves (Test-Driven Development) inverteix l'ordre habitual: primer la prova, després el codi.
graph LR
R["VERMELL<br/>escriu una prova<br/>que falla"] --> V["VERD<br/>el codi minim<br/>que la fa passar"]
V --> RF["REFACTOR<br/>millora el disseny<br/>sense tocar la prova"]
RF --> R
style R fill:#f8d7da,stroke:#842029
style V fill:#d1e7dd,stroke:#0f5132
style RF fill:#cfe2ff,stroke:#084298
Un cicle complet sobre una regla real d'Escena Viva: cap comanda no pot superar les 6 entrades per sessió.
Vermell. Escrivim la prova abans que existeixi la comprovació:
// La regla encara no esta implementada: aquesta prova HA de fallar.
prova('rebutja una comanda de mes de 6 entrades per a la mateixa sessio', () => {
const sessio = crearSessio({ aforament: 400, venudes: 0 });
let haLlancat = false;
try {
sessio.vendre(7);
} catch (error) {
haLlancat = true;
}
comprovar(haLlancat === true);
});Executem i falla. Aquest pas no és burocràcia: verifica que la prova sap detectar la fallada. Si ja passés en vermell, la prova estaria mal escrita.
Verd. El codi mínim que la satisfà:
// src/domini/sessio.js (fragment)
const MAXIM_PER_COMANDA = 6;
vendre(quantitat) {
if (!Number.isInteger(quantitat) || quantitat < 1) {
throw new ErrorDeValidacio('La quantitat ha de ser un enter positiu');
}
if (quantitat > MAXIM_PER_COMANDA) {
throw new ErrorDeValidacio(`Maxim ${MAXIM_PER_COMANDA} entrades per comanda`);
}
// ...resta de la logica d'aforament
}Refactor. Ara sí que millorem: extraiem MAXIM_PER_COMANDA a una constant exportada perquè l'esquema zod i el missatge d'error facin servir el mateix nombre, i afegim els detalls de l'error amb el màxim permès. La prova ens protegeix durant el canvi.
I ara l'honestedat promesa:
| TDD ajuda molt quan... | TDD fa nosa quan... |
|---|---|
| La regla de negoci és clara i verificable | Estàs explorant una API que no coneixes |
| Arregles una fallada (la prova la reprodueix primer) | Maquetes una interfície visual |
| Dissenyes una funció pura, com la política de permisos | El disseny canviarà tres vegades aquesta tarda |
| Treballes sobre codi heretat i vols fixar el comportament actual | Escrius un script d'un sol ús |
No és una religió. En aquest curs escriurem algunes proves abans i moltes després, i a 09-06 farem servir TDD de manera estricta per a una cosa concreta en què és indiscutible: reproduir una fallada abans d'arreglar-la.
El panorama d'eines per a Node
| Eina | Què és | Punts forts | Inconvenients |
|---|---|---|---|
| Mocha | Executor de proves | Madur, flexible, no imposa assercions ni dobles, configuració transparent | Has de muntar la pila (Chai, Sinon) tu mateix |
| Chai | Biblioteca d'assercions | expect molt llegible, missatges de fallada clars, extensible |
Dependència extra |
| Sinon | Dobles de prova | Espies, stubs, rellotges falsos, l'estàndard de facto | Fàcil d'abusar-ne |
| supertest | Client HTTP per a proves | Prova una app d'Express sense listen manual |
Només HTTP |
| c8 / nyc | Cobertura | c8 fa servir la cobertura nativa de V8, sense instrumentar | Mètrica fàcil de malinterpretar |
| Jest | Tot en un | Executor, assercions, mocks i cobertura junts; instantànies | Opinat; la seva transformació complica el CommonJS/ESM pur |
| Vitest | Tot en un modern | Rapidíssim, API compatible amb Jest, gran suport d'ESM | Va néixer al món Vite; menys comú en APIs pures de Node |
node:test |
Executor natiu | Zero dependències, inclòs a Node, amb --test i cobertura integrada |
API més jove, ecosistema de complements menor |
L'executor natiu es mereix un paràgraf honest. Des de Node 20 és estable i perfectament utilitzable:
// Com es veuria amb l'executor natiu (referencia, no el farem servir)
const { test } = require('node:test');
const assert = require('node:assert/strict');
test('descompta les localitats venudes de l aforament', () => {
const sessio = crearSessio({ aforament: 400, venudes: 100 });
sessio.vendre(3);
assert.equal(sessio.lliures, 297);
});Si comencessis un projecte nou avui, node:test és una elecció defensable i sense dependències.
Per què aquest curs fa servir Mocha + Chai + Sinon + supertest: perquè és la pila més estesa a les APIs de Node que et trobaràs en producció, perquè separa amb claredat les tres responsabilitats (executar, afirmar, simular) i això ensenya millor els conceptes, perquè la seva documentació d'errors és explícita, i perquè les idees es traslladen a qualsevol altra pila en una tarda. Un cop triada la pila, no canviarem a mitja lliçó del mòdul: barrejar executors és una font clàssica de confusió.
El pla de proves d'Escena Viva
Aquest és el recorregut del mòdul:
| Lliçó | Què es prova | Eines |
|---|---|---|
| 09-02 | Domini pur: Sessio, Esdeveniment, GestorDeVendes, i la matriu completa de politica.js |
Mocha, Chai |
| 09-03 | Unitats amb dependències: canvi-divises.js, tokens que caduquen, repositoris |
Sinon |
| 09-04 | L'API real de punta a punta: compra, rebuigs 401/403/404/409/422, concurrència | supertest |
| 09-05 | Cobertura, llindars, scripts d'npm, proves intermitents, preparació per a CI | c8 |
| 09-06 | Depuració del que falli: inspector, VS Code, traces, fuites de memòria | Node i DevTools |
L'estructura de carpetes que crearem, mirall de src/:
escena-viva/
├── src/
│ ├── domini/
│ ├── autoritzacio/
│ ├── repositoris/
│ └── ...
├── test/
│ ├── unitat/
│ │ ├── sessio.test.js
│ │ ├── esdeveniment.test.js
│ │ ├── politica.test.js
│ │ └── gestor-vendes.test.js
│ ├── integracio/
│ │ ├── esdeveniments.test.js
│ │ └── comandes.test.js
│ └── ajudes/
│ ├── fabriques.js
│ └── autenticacio.js
└── .mocharc.jsonTres convencions que seguirem sense excepció:
- Sufix
.test.jsa tots els fitxers de prova: fa trivial el patró de cerca de Mocha i distingeix les proves de les ajudes. - Mirall del codi font:
src/domini/sessio.jses prova atest/unitat/sessio.test.js. Trobar la prova d'un fitxer no ha de requerir mai una cerca. test/ajudes/no conté proves, només utilitats compartides: fàbriques de dades i l'ajuda d'autenticació que resoldrà la promesa del mòdul 8.
Errors Comuns i Consells
- Escriure proves per pujar un número. La cobertura és un indicador, no un objectiu. Ho tractarem a fons a 09-05, però interioritza-ho ja: una prova que executa codi sense comprovar res puja la cobertura i no protegeix de res.
- Començar per les proves d'extrem a extrem perquè «proven de veritat». Acabaràs amb el con de gelat i una bateria que ningú no executa.
- Provar mètodes privats. Si sents aquesta necessitat, normalment aquella lògica vol ser una funció pública en un altre mòdul.
#venudeses prova a través delliuresiexhaurida. - Proves que depenen de l'ordre. «Funciona si executes tot el fitxer però falla sola» és el símptoma. Cada
itha de poder executar-se en solitari. - Reutilitzar objectes entre proves per «no repetir». Compartir un objecte mutable entre
ités la causa número u de proves intermitents. Fes servir fàbriques que retornin objectes nous. - Consell: comença per la capa de més risc i menys cost. A Escena Viva això és
src/autoritzacio/politica.js: funcions pures, sense dependències, que protegeixen el més sensible del sistema. Es prova sencera en cinquanta línies. - Consell: tracta el codi de les proves com a codi de producció. Es llegeix més vegades de les que s'escriu i s'ha de mantenir.
Exercicis
Exercici 1: classificar per nivell
Per a cada comportament d'Escena Viva, indica a quin nivell de la piràmide el provaries i per què:
- El total d'una comanda de 2 entrades a 2500 cèntims és 5000.
POST /api/comandessense capçaleraAuthorizationretorna 401.- Un organitzador d'
org-bovedano pot editarevt-001, que pertany aorg-almendra. - El middleware
limitCompras'aplica abans que el controlador de comandes. generarHashContrasenyafa servir cost 12.
Exercici 2: reescriure noms
Reescriu aquests noms de prova seguint les regles de la lliçó:
test comprarEntradespolitica funciona beerror 409no peta amb quantitat 0
Exercici 3: dissenyar un cicle TDD
Escriu (en pseudocodi, sense executar) el cicle vermell-verd-refactor per a aquesta regla nova: una sessió que ja ha començat no admet vendes. Indica quina prova escriuries primer, quin codi mínim la faria passar i què refactoritzaries després.
Solucions
Exercici 1
- Unitària. És un càlcul pur al domini; no necessita HTTP ni base de dades.
- Integració. El 401 neix de la combinació ruta + middleware
autenticar+gestorDErrors. Cap prova unitària del middleware no garanteix que estigui realment muntat en aquella ruta. - Unitària, amb
potGestionarEsdeveniment, perquè és una funció pura i podem recórrer la matriu sencera de manera barata i exhaustiva. A més una prova d'integració de confirmació (403 real per HTTP), no les trenta. - Integració. L'ordre dels middlewares només és observable executant l'aplicació real: és exactament el que les proves unitàries no poden veure.
- Cap, o gairebé. És una constant de configuració. Provar el cost exacte de bcrypt és provar la biblioteca; sí que té sentit una prova que
verificarContrasenyaaccepta el hash que produeixgenerarHashContrasenya(comportament, no detall).
Exercici 2
crea una comanda amb estat pendent i descompta l aforament de la sessiopermet a l administrador gestionar qualsevol esdevenimentretorna ConflicteDEstat si les localitats lliures son menors que les sollicitadesllanca ErrorDeValidacio si la quantitat es zero
Exercici 3
Vermell: prova rebutja la venda si la sessio ja ha comencat, que crea una sessió amb inici al passat, crida vendre(1) i espera un ConflicteDEstat. Falla perquè vendre no mira la data.
Verd: afegir al principi de vendre una comprovació if (new Date(this.inici) <= new Date()) { throw new ConflicteDEstat('La sessio ja ha comencat'); }.
Refactor: extreure un getter get haComencat() que encapsuli la comparació, reutilitzable pel catàleg per no llistar sessions passades, i injectar el rellotge en comptes de cridar new Date() directament. Aquest últim punt és justament el que fa possible la lliçó 09-03: el codi que depèn del rellotge real no es pot provar de manera determinista.
Conclusió
Hem posat els fonaments. Sabem per què es prova —per poder canviar el codi sense por, no per si de cas—, com s'estructura una prova amb preparar, actuar i comprovar, quins nivells existeixen i per què la piràmide té la forma que té, què mereix prova segons el risc i què no, quines propietats fan bona una prova, com distingir una prova fràgil d'una de robusta, quan TDD ajuda de veritat i quines eines hi ha a l'ecosistema de Node.
També tenim el pla: test/unitat/, test/integracio/, test/ajudes/, fitxers *.test.js, i la pila Mocha + Chai + Sinon + supertest.
El que encara no tenim és ni una sola línia executable. A la lliçó següent, Proves Unitàries amb Mocha i Chai, instal·lem la pila, arreglem d'una vegada l'script test que fa quatre mòduls que falla a propòsit, i escrivim la bateria unitària completa del domini d'Escena Viva, inclosa aquella taula de casos que recorre la matriu de permisos cel·la per cel·la que portem prometent des del mòdul 8.
Curs de Node.js: De Principiant a Avançat
Mòdul 1: Introducció a Node.js
- Què és Node.js?
- Instal·lació i Configuració de l'Entorn
- El Teu Primer Programa en Node.js
- El REPL de Node.js
- JavaScript Modern per a Node.js
- El Projecte del Curs: la Plataforma Escena Viva
Mòdul 2: Conceptes Bàsics
- Arquitectura de Node.js
- El Bucle d'Esdeveniments (Event Loop)
- Callbacks i Programació Asíncrona
- Promeses i async/await
- Esdeveniments i EventEmitter
- Mòduls CommonJS i require()
- Mòduls ES i Interoperabilitat
Mòdul 3: Sistema de Fitxers i E/S
- Lectura i Escriptura de Fitxers
- El Mòdul fs a Fons
- Rutes Multiplataforma amb el Mòdul path
- Treballant amb Streams
- Streams de Transformació i pipeline
- Buffers i Dades Binàries
Mòdul 4: HTTP i Servidors Web
- Creant un Servidor HTTP Simple
- Gestió de Sol·licituds i Respostes
- Enrutament Manual
- Servint Fitxers Estàtics
- Rebent Dades: Cossos de Petició i JSON
- Consumint APIs Externes des de Node.js
Mòdul 5: NPM i Gestió de Paquets
- Introducció a NPM i package.json
- Instal·lació i Ús de Paquets
- Versionat Semàntic i package-lock
- Scripts d'npm i Automatització del Projecte
- Creació i Publicació de Paquets
- Seguretat i Manteniment de Dependències
Mòdul 6: Framework Express.js
- Introducció a Express.js
- Configuració d'una Aplicació Express
- Enrutament a Express
- Middleware
- Middleware de Tercers Essencials
- Validació de Dades d'Entrada
- Gestió d'Errors
Mòdul 7: Bases de Dades i ORMs
- Introducció a les Bases de Dades
- Usant MongoDB amb Mongoose
- Operacions CRUD
- Relacions, Poblat i Consultes Avançades
- Usant Bases de Dades SQL amb Sequelize
- Migracions, Transaccions i Dades de Prova
Mòdul 8: Autenticació i Autorització
- Introducció a l'Autenticació
- Registre d'Usuaris i Hash de Contrasenyes
- Sessions i Galetes amb Passport.js
- Autenticació amb JWT
- Control d'Accés Basat en Rols
- Bones Pràctiques de Seguretat en APIs
Mòdul 9: Proves i Depuració
- Introducció a les Proves
- Proves Unitàries amb Mocha i Chai
- Dobles de Prova amb Sinon
- Proves d'Integració
- Cobertura i Automatització de les Proves
- Depuració d'Aplicacions Node.js
Mòdul 10: Temes Avançats
- El Mòdul Cluster
- Fils de Treball (Worker Threads)
- Memòria Cau i Cues de Treball amb Redis
- Optimització del Rendiment
- Construcció d'APIs RESTful
- GraphQL amb Node.js
Mòdul 11: Desplegament i DevOps
- Configuració i Variables d'Entorn
- Registre i Monitoratge en Producció
- Usant PM2 per a la Gestió de Processos
- Empaquetatge amb Docker
- Desplegant a Heroku i Altres PaaS
- Integració i Desplegament Continus
