web-dev-qa-db-fra.com

Maquette d'objet manuelle dans Jest

J'essaie de comprendre les simulations manuelles dans Jest. Je pense que cela devrait être facile ... mais ce n'est pas le cas.

Mes répertoires de projets sont comme

  • __tests __
    • user-test.js
  • des modèles
    • user.js
    • __mocks __
      • user.js
  • node_modules
    • ...
  • package.json

Les modèles/user.js et models/__ mocks __/user.js ont le même code:

module.exports = {
    create(username, password) {
        return new Promise(function(resolve, reject) {
            setTimeout(function() {
                resolve({"username":username, "password": password});
            }, 100);
        });
    }
}

Le fichier __tests __/user-test.js ressemble à ceci:

test('user creation works', () => {
    const user = require('../models/user');
    //const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

Cela fonctionne bien, les tests réussissent, mais quand je le change en:

test('user creation works', () => {
    //const user = require('../models/user');
    const user = jest.mock('../models/user');
    return user.create("mitchell", "boo");
});

Cela ne fonctionne pas et crache:

 FAIL  __tests__\user-test.js
  ● user creation works

    TypeError: user.create is not a function

      at Object.<anonymous>.test (__tests__\user-test.js:4:17)
      at process._tickCallback (internal\process\next_tick.js:103:7)
10
turiyag

Ah! Deviner! Ma structure de dossiers est très bien. Il s'avère que j'ai eu un malentendu quant à ce que "jest.mock" a réellement fait. "jest.mock" change le comportement de la fonction "require" du noeud pour utiliser le mock, il ne fait pas de require lui-même.

Mon test aurait dû ressembler à:

jest.mock('../models/user');
test('user creation works', () => {
    const user = require('../models/user');
    return user.create("mitchell", "boo");
});
20
turiyag