web-dev-qa-db-fra.com

Comment tester si la fonction a été appelée avec des paramètres définis (toHaveBeenCalledWith) avec Jest

Je veux tester, si une fonction particulière a été appelée dans mon test et avec les paramètres corrects. De la documentation JEST, je ne suis pas en mesure de comprendre quelle est la bonne façon de le faire.

Disons que j'ai quelque chose comme ça:

// add.js

function child(ch) {
   const t = ch + 1;
   // no return value here. Function has some other "side effect"
}


function main(a) {
  if (a == 2) {
    child(a + 2);
  }

  return a + 1;
}

exports.main = main;
exports.child = child;

Maintenant en test unitaire:

1. Je veux exécuter main(1) et tester qu'il a renvoyé 2 Et child() n'a pas été appelé.

2. Ensuite, je veux exécuter main(2) et puis il a renvoyé 3 Et child(4) a été appelé exactement une fois.

J'ai quelque chose comme ça maintenant:

// add-spec.js
module = require('./add');

describe('main', () => {

  it('should add one and not call child Fn', () => {
    expect(module.main(1)).toBe(2);
    // TODO: child() was not called
  });

  it('should add one andcall child Fn', () => {

    expect(module.main(2)).toBe(3);
    // TODO: child() was called with param 4 exactly once
    // expect(module.child).toHaveBeenCalledWith(4);
  });

});

Je teste cela dans https://repl.it/languages/jest , donc un exemple de travail dans ce REPL sera très apprécié.

15
DHlavaty

OK, je l'ai compris. L'astuce consiste à diviser les fonctions en fichiers séparés. Le code est donc (et fonctionne dans https://repl.it/languages/jest ):

// add.js
child = require('./child').child;

function main(a) {
  if (a == 2) {
    child(a + 2);
  }

  return a + 1;
}

exports.main = main;

fichier child.js extrait:

// child.js

function child(ch) {
   const t = ch + 1;
   // no return value here. Function has some other "side effect"
}

exports.child = child;

fichier de test principal:

// add-spec.js
main = require('./add').main;
child = require('./child').child;

child = jest.fn();

describe('main', () => {

  it('should add one and not call child Fn', () => {
    expect(main(1)).toBe(2);

    expect(child).toHaveBeenCalledTimes(0);
  });

  it('should add one andcall child Fn', () => {
    expect(main(2)).toBe(3);

    expect(child).toHaveBeenCalledWith(4);
    expect(child).toHaveBeenCalledTimes(1);
  });

});
10
DHlavaty