Appearance
Tester une application MongoDB
Voici le code:
ts
import request from 'supertest';
import { MongoMemoryServer } from 'mongodb-memory-server';
import mongoose from 'mongoose';
import run, { User } from './server'
import { beforeEach, describe, afterEach, expect, afterAll } from 'vitest';
let app
let mongoServer
beforeEach(async () => {
mongoServer = await MongoMemoryServer.create()
const uri = mongoServer.getUri();
app = run(uri); // on récupère app de ExpressJS
})
// Test avec Jest et Supertest
describe('Endpoint Tests', () => {
test('should respond to a GET request', async () => {
const user = new User({
name: 'test'
});
await user.save()
const response = await request(app).get('/api/users');
expect(response.statusCode).toBe(200);
expect(response.body).toEqual({ /* réponse attendue */ });
});
});
// Après les tests, fermez la connexion à la base de données
afterAll(async () => {
await mongoose.connection.close();
await mongoServer.stop();
});
import request from 'supertest';
import { MongoMemoryServer } from 'mongodb-memory-server';
import mongoose from 'mongoose';
import run, { User } from './server'
import { beforeEach, describe, afterEach, expect, afterAll } from 'vitest';
let app
let mongoServer
beforeEach(async () => {
mongoServer = await MongoMemoryServer.create()
const uri = mongoServer.getUri();
app = run(uri); // on récupère app de ExpressJS
})
// Test avec Jest et Supertest
describe('Endpoint Tests', () => {
test('should respond to a GET request', async () => {
const user = new User({
name: 'test'
});
await user.save()
const response = await request(app).get('/api/users');
expect(response.statusCode).toBe(200);
expect(response.body).toEqual({ /* réponse attendue */ });
});
});
// Après les tests, fermez la connexion à la base de données
afterAll(async () => {
await mongoose.connection.close();
await mongoServer.stop();
});
Initialisation de
MongoMemoryServer
: Avant chaque test, une nouvelle instance deMongoMemoryServer
est créée. Cette instance fournit une URL de connexion à une base de données MongoDB en mémoire.javascriptbeforeEach(async () => { mongoServer = await MongoMemoryServer.create(); const uri = mongoServer.getUri(); app = run(uri); // Initialisez votre application Express avec cette URI });
beforeEach(async () => { mongoServer = await MongoMemoryServer.create(); const uri = mongoServer.getUri(); app = run(uri); // Initialisez votre application Express avec cette URI });
Connexion à la Base de Données : Dans votre application Express (
run
), vous devez connectermongoose
à l'URI fournie parMongoMemoryServer
.
Écriture des Tests
Création d'un Utilisateur de Test : Avant d'effectuer la requête de test, vous créez et sauvegardez un utilisateur de test dans la base de données.
javascriptconst user = new User({ name: 'test' }); await user.save();
const user = new User({ name: 'test' }); await user.save();
Requête de Test avec Supertest : Utilisez
supertest
pour faire des requêtes HTTP à votre API. Ici, vous testez un endpoint GET.javascriptconst response = await request(app).get('/api/users'); expect(response.statusCode).toBe(200); expect(response.body).toEqual({ /* réponse attendue */ });
const response = await request(app).get('/api/users'); expect(response.statusCode).toBe(200); expect(response.body).toEqual({ /* réponse attendue */ });
Assurez-vous que la réponse attendue dans
expect(response.body).toEqual({ /* réponse attendue */ });
correspond à ce que votre API est censée retourner.
Nettoyage Après les Tests
Fermeture de la Connexion à la Base de Données : Après tous les tests, fermez la connexion à la base de données MongoDB pour éviter les fuites de mémoire et les problèmes de connexion.
javascriptafterAll(async () => { await mongoose.connection.close(); await mongoServer.stop(); });
afterAll(async () => { await mongoose.connection.close(); await mongoServer.stop(); });
Points Clés
Isolation des Tests : Chaque test fonctionne avec une instance fraîche de la base de données, ce qui garantit que les tests ne sont pas affectés les uns par les autres.
Tests Rapides et Fiables : En utilisant une base de données en mémoire, les tests sont rapides et ne dépendent pas d'une base de données externe, ce qui les rend plus fiables.
Nettoyage Automatique :
MongoMemoryServer
s'occupe du nettoyage de la base de données après les tests, donc vous n'avez pas à vous soucier de l'état de la base de données après chaque test.:::