3 votes

Tests Mocha avec code d'initialisation asynchrone

J'écris des tests pour une bibliothèque client REST qui doit se connecter au service en utilisant l'échange OAuth. Afin d'éviter de se connecter pour chaque point d'accès que je vais tester, j'aimerais écrire une sorte de "configuration de test", mais je ne sais pas exactement comment faire.

La structure de mon projet de test :

  • test
    • endpoint-category1.spec.ts
    • endpoint-category2.spec.ts

Si je n'avais qu'une seule "catégorie finale", j'aurais quelque chose comme ça :

describe('Endpoint category 1', () => {
  let api: Client = null;

  before(() => {
    api = new Client(credentials);
  });

  it('should successfully login using the test credentials', async () => {
    await api.login();
  });

  it('should return xyz\'s profile', async () => {
    const r: Lookup = await api.lookup('xyz');
    expect(r).to.be.an('object');
  });
});

Ma question :

Puisque la méthode login() est le premier test, cela fonctionnerait et l'instance du client serait disponible pour tous les tests suivants. Cependant, comment puis-je faire une sorte de configuration où je rends l'"instance api connectée" disponible pour mes autres fichiers de test ?

3voto

estus Points 5252

Le code commun devrait être déplacé vers beforeEach :

  beforeEach(async () => {
    await api.login();
  });

A ce stade should successfully login using the test credentials n'a pas beaucoup de sens car il n'affirme rien.

1voto

leaf4monkey Points 28
describe('Endpoint category 1', () => {
  let api: Client = null;

  beforeEach(() => {
    api = new Client(credentials);
  });

  afterEach(() => {
    // You should make every single test to be ran in a clean environment.
    // So do some jobs here, to clean all data created by previous tests.
  });

  it('should successfully login using the test credentials', async () => {
    const ret = await api.login();
    // Do some assert for `ret`.
  });

  context('the other tests', () => {
    beforeEach(() => api.login());
    it('should return xyz\'s profile', async () => {
      const r: Lookup = await api.lookup('xyz');
      expect(r).to.be.an('object');
    });
  });
});

0voto

Markus Points 100

Avez-vous jeté un coup d'œil à https://mochajs.org/#asynchronous-code ?

Vous pouvez mettre un paramètre "done" dans vos fonctions de test et vous obtiendrez un callback que vous devrez appeler.

terminé() o fait(erreur/exception)

Ce travail serait également disponible en avant et après.

En appelant done() mocha sait que votre code asynchrone est terminé.

Ah. Et si vous voulez tester la connexion, vous ne devriez pas fournir cette connexion à d'autres tests, car il n'y a aucune garantie de l'ordre des tests dans la configuration par défaut.

Testez simplement la connexion et la déconnexion après.

Si vous avez besoin de plus de tests avec "login-session", décrivez-en un nouveau avec befores.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X