Aller au contenu
Mocking des classes ES6 dans les tests unitaires
  1. Blogs/

Mocking des classes ES6 dans les tests unitaires

··286 mots·2 mins·
Sommaire

Cet article passe en revue certains modèles pouvant être utilisés pour tester les classes ES6.

Les exemples utiliseront l’auto-mocking du module Jest mais devraient être portables à d’autres bibliothèques de mocking de module (par exemple Proxyquire) avec quelques modifications.

Dans cet article, nous avons exploré comment définir des modèles Sequelize en utilisant des classes ES6. Un des avantages d’une telle approche est qu’elle permet des tests unitaires faciles, elle permet d’instancier le modèle sans le bagage de toute Sequelize (et/ou une base de données).

Nous allons tester le modèle suivant (qui est une classe ES6):

const { Model } = require('sequelize');
class MyModel extends Model {
  static init() {
    return super
      .init
      // Config, see "Using ES6 classes for Sequelize 4 models"
      ();
  }
  isAvailable(date) {
    if (!Array.isArray(this.meetings)) {
      throw new Error('meetings should be eager-loaded');
    }
    return !this.meetings.find(({ startDate, endDate }) => startDate < date && endDate > date);
  }
}

Au niveau des modules, nous le voulons:

  • mock/stub Sequelize (et la classe de base Model)
  • importer le modèle

Dans le test:

  • Instantaner le modèle que nous avons défini (sans crash)
  • Définissez quelques propriétés sur cette instance
  • Exécuter certaines méthodes
  • Affirmer sur le rendement
jest.mock('sequelize');
const Model = require('./model');
test('It should not throw when passed a model containing an empty list of meetings', () => {
  const model = new Model();
  model.meetings = [];
  expect(model.isAvailable.bind(null, new Date(Date.now())).not.toThrow();
});

Alternative avec Object.assign
#

Si nous définissons plus d’une propriété d’instance unique, l’utilisation de Object.assign peut être plus simple à gérer:

jest.mock('sequelize');
const Model = require('./model');
test('It should not throw when passed a model containing an empty list of meetings', () => {
  const model = Object.assign(
    new Model(),
    {
      meetings: []
    }
  );
  expect(model.isAvailable.bind(null, new Date(Date.now())).not.toThrow();
});

Articles connexes

Comment paginer des données dans MySQL avec Sequelize
··305 mots·2 mins

Souvent, je me trouve aux prises avec Sequelize pour trouver une réponse directe à ma requête. Récemment, je travaillais sur une application full stack dans laquelle il était impératif de paginer les résultats depuis le backend (API REST) vers le client. Je me suis battu pour deux raisons. Tout d’abord, venant du context NoSQL, il est difficile de saisir les bases de données SQL. La deuxième raison étant que la documentation de Sequelize ne fournit pas une solution claire et directe à cette abstraction très basique. Beaucoup de gens supposent des choses dans le monde des bases de données SQL.

Utilisation des classes ES6 pour les modèles Sequelize 4 ou 5
··628 mots·3 mins
Sequelize supporte les classe ES6, mais la documentation manque un peu.
Sequelize DataTypes: guide pratique
··506 mots·3 mins
Les DataTypes sont au coeur de la bibliothèque Sequelize. Ceci est un guide pratique et complet pour compenser la documentation officielle clairsemée de Sequelize sur le sujet.