Skip to content

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();
});
  1. Initialisation de MongoMemoryServer : Avant chaque test, une nouvelle instance de MongoMemoryServer est créée. Cette instance fournit une URL de connexion à une base de données MongoDB en mémoire.

    javascript
    beforeEach(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
    });
  2. Connexion à la Base de Données : Dans votre application Express (run), vous devez connecter mongoose à l'URI fournie par MongoMemoryServer.

Écriture des Tests

  1. 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.

    javascript
    const user = new User({ name: 'test' });
    await user.save();
    const user = new User({ name: 'test' });
    await user.save();
  2. Requête de Test avec Supertest : Utilisez supertest pour faire des requêtes HTTP à votre API. Ici, vous testez un endpoint GET.

    javascript
    const 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

  1. 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.

    javascript
    afterAll(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.

  • :::