Ho chiesto a chatGPT come usare TDD con javascript, pensando a Inde Cloud.
Librerie più usate per Unit Test in JavaScript
- Jest (molto usato con React, semplice e potente)
- Mocha + Chai (flessibile, popolare con Node.js)
- Jasmine (simile a Jest, spesso usato in Angular)
- Vitest (alternativa a Jest, più veloce per progetti moderni)
Mocking e Spying
A volte dobbiamo testare funzioni che chiamano API o interagiscono con database. Qui entra in gioco il mocking.
Esempio con Jest Mock
const fetchData = require(‘./fetchData’);
jest.mock(‘./fetchData’); // Crea un mock della funzione
test(‘Dovrebbe restituire i dati finti’, async () => {
fetchData.mockResolvedValue({ id: 1, name: ‘Mario’ });
const result = await fetchData();
expect(result).toEqual({ id: 1, name: ‘Mario’ });
});
Test Coverage
Per misurare quanti pezzi di codice sono coperti dai test, puoi usare il comando:
sh
CopiaModifica
jest --coverage
Otterrai un report con le percentuali di codice testate. Più alta è la copertura, meglio è!
Ho chiesto: ma i test me li potrebbe scrivere l’IA?
ChatGPT ha detto:
ChatGPT
Sì, assolutamente! L’IA può scrivere test unitari per te, sia per codice esistente che seguendo un approccio TDD. Ti faccio vedere alcuni esempi pratici con Jest.
1. Creazione automatica di unit test per codice esistente
Se mi fornisci una funzione JavaScript, posso generarti i test automaticamente. Ad esempio, se hai questa funzione:
javascript
CopiaModifica
function somma(a, b) {
return a + b;
}
L’IA può generare automaticamente i test:
javascript
CopiaModifica
// somma.test.js
const somma = require('./somma');
test('Dovrebbe sommare 2 + 3 e restituire 5', () => {
expect(somma(2, 3)).toBe(5);
});
test('Dovrebbe sommare numeri negativi', () => {
expect(somma(-1, -3)).toBe(-4);
});
test('Dovrebbe sommare numeri decimali', () => {
expect(somma(2.5, 2.5)).toBe(5);
});
2. TDD: Generare test PRIMA del codice
Se stai seguendo TDD, puoi chiedere all’IA di generare test prima ancora di scrivere la funzione. Ad esempio:
javascript
CopiaModifica
// moltiplica.test.js
const moltiplica = require('./moltiplica');
test('Dovrebbe moltiplicare 2 per 3 e restituire 6', () => {
expect(moltiplica(2, 3)).toBe(6);
});
test('Dovrebbe restituire 0 se uno dei numeri è 0', () => {
expect(moltiplica(10, 0)).toBe(0);
});
test('Dovrebbe funzionare con numeri negativi', () => {
expect(moltiplica(-2, 3)).toBe(-6);
});
Ora il test fallisce perché moltiplica.js non esiste. Quindi, scrivi solo il codice necessario per far passare il test:
javascript
CopiaModifica
// moltiplica.js
function moltiplica(a, b) {
return a * b;
}
module.exports = moltiplica;
3. Test con mocking (API e database)
Se hai una funzione che chiama un’API, l’IA può scriverti un test che usa mocking:
Funzione originale che chiama un’API
javascript
CopiaModifica
const axios = require('axios');
async function getUser(userId) {
const response = await axios.get(`https://jsonplaceholder.typicode.com/users/${userId}`);
return response.data;
}
module.exports = getUser;
Test con mock di Axios
javascript
CopiaModifica
const getUser = require('./getUser');
const axios = require('axios');
jest.mock('axios'); // Mock di Axios
test('Dovrebbe restituire i dati di un utente', async () => {
const userData = { id: 1, name: 'Mario Rossi' };
axios.get.mockResolvedValue({ data: userData });
const result = await getUser(1);
expect(result).toEqual(userData);
});
4. Generazione automatica di test con IA
Come posso generare test per te?
- Se mi dai una funzione, ti posso scrivere i test.
- Se mi descrivi una funzionalità, ti posso scrivere sia i test che il codice (TDD).
- Se hai un file di codice, posso analizzarlo e creare test adatti.
Vuoi che generi test per un tuo codice specifico? Mandami la funzione e te li scrivo subito! ![]()