0
votes

Comment tester une méthode avec Settimeout et JQuery en utilisant Jest

Je lance un peu pour trouver une solution sur la manière de tester cette fonction exportée avec Jest. XXX PRE>

J'ai importé dans mon fichier de test et essayé de le démarrer: P >

import { scrollToError } from './utils';

describe('Utils', () => {
  it('should scroll to error', () => {
    const result = scrollToError();
    expect(result).toBe(true); //added this just to force an error and got result as undefined 
  });
});


0 commentaires

3 Réponses :


1
votes

ScrolltoError () est une fonction asynchrone et vous ne pouvez pas l'invoquer et vous attendre à ce que le résultat soit là immédiatement. Vous devez attendre ce montant de MS (400 dans votre cas), avant de le tester.

Le code asynchrone est testé un peu différemment dans la JEST: Test du code asynchrone . Vous pouvez aussi Prenez le contrôle sur les minuteries ou de la combiner avec le Manuel moqueur et remplacer jQuery lui-même.


1 commentaires

Mais qu'en est-il de la jQuery .. J'essayais de trouver un moyen de se moquer ..



1
votes

Comment utilisez-vous jQuery?

Je veux dire, avez-vous eu l'obtention de NPM ou de fil? Pour se moquer de nœud_modules, vous pouvez suivre ce lien: https://jestjs.io / Docs / fr / Manual-Mocks # MODING-NODE-MODULES

Sinon, vous devrez créer une simulation manuelle. Vous pouvez voir comment faire ici: https://jestjs.io/docs/fr/manual -Mocks

mise à jour:

Le moyen le plus simple est de le remplacer, c'est tout en réglant votre test à avant-membres méthode.

Vous pouvez simplement mettre quelque chose comme fenêtre.jQuery = jest.fn ();

C'est la maquette la plus simple jamais, mais vous devrez créer les méthodes telles que Animate et d'autres méthodes liées à JQuery.

Avoir une deuxième pensée ici et à la recherche de votre fonction, si vous vous moquez de JQuery, ce qui reste à tester?

Si vous vous moquez, vous testez si votre FN effectue les étapes que vous avez définies ici. Comme chèque si le jQuery fn a été appelé avec .has-error classe ou si animate a reçu les paramètres corrects.

Ce type de test ne vous aide pas du tout, il ne s'agit que de vérifier s'il s'agit d'une ligne suivante par votre algorithme. Le problème ici, que vous pouvez faire des refactorings tels que la modification du nom de la classe error ou la méthode d'animation par d'autres améliorées.

Qu'est-ce que vous avez vraiment besoin de changer, si cela fait à la fin ce devrait faire. Affichant le div ou tout ce qui devrait être affiché. Si vous testez cela, quelle que soit la façon dont vous refactez votre code, le test vérifiera si la solution finale fonctionne toujours et que ce qui compte.

Était-je clair? L'anglais n'est pas ma langue maternelle, il peut être un peu déroutant


1 commentaires

La difficulté ici est de créer un manuel moqueur pour cela ... Je ne l'utilise pas de nœud_modules ...



0
votes

J'ai finalement réussi à trouver une solution appropriée. J'ai écrit trois cas de test:

jest.useFakeTimers();
describe('utils', () => {
  afterEach(() => {
    document.body.innerHTML = '';
  });
  it('ScrollToError - should run the settimeout for 400 ms', () => {
    scrollToError();
    expect(setTimeout).toHaveBeenCalledTimes(1);
    expect(setTimeout).toHaveBeenCalledWith(expect.any(Function), 400);
  });
  it('ScrollToError - should scroll to error', () => {
    document.body.innerHTML = formStep1ErrorMock;
    window.setTimeout = fn => fn();
    const result = scrollToError();
    expect(result).toBe(true);
  });
  it('ScrollToError - should do nothing as has no errors', () => {
    document.body.innerHTML = formStep1Mock;
    window.setTimeout = fn => fn();
    const result = scrollToError();
    expect(result).toBe(true);
  });
});


0 commentaires