227 votes

Jest: meilleur moyen de désactiver la console dans les tests unitaires

Je me demande s'il existe un meilleur moyen de désactiver les erreurs de console dans un test Jest spécifique (c'est-à-dire, restaurer la console d'origine avant / après chaque test).

Voici mon approche actuelle:

 describe("Some description", () => {
  let consoleSpy;

  beforeEach(() => {
    if (typeof consoleSpy === "function") {
      consoleSpy.mockRestore();
    }
  });

  test("Some test that should not output errors to jest console", () => {
    expect.assertions(2);

    consoleSpy = jest.spyOn(console, "error").mockImplementation();

    // some function that uses console error
    expect(someFunction).toBe("X");
    expect(consoleSpy).toHaveBeenCalled();
  });

  test("Test that has console available", () => {
    // shows up during jest watch test, just as intended
    console.error("test");
  });
});
 

Existe-t-il un moyen plus propre de réaliser la même chose? Je voudrais éviter spyOn , mais mockRestore semble seulement fonctionner avec cela .

Merci!

311voto

Raja Jaganathan Points 2053

Andreas est assez bon pour le fichier de spécifications. La configuration ci-dessous supprimera les instructions console.log pour toutes les suites de tests,

 jest --silent
 

(ou)

Pour personnaliser warn, info and debug vous pouvez utiliser la configuration ci-dessous

__tests __ / setup.js

 global.console = {
    log: jest.fn()
}
 

jest.config.js

 module.exports = {
    verbose: true,
    setupTestFrameworkScriptFile: "<rootDir>/__tests__/setup.js",
};
 

84voto

Andreas Köberle Points 16453

Comme chaque fichier de test s'exécute dans son propre thread, il n'est pas nécessaire de le restaurer si vous souhaitez le désactiver pour tous les tests d'un fichier. Pour la même raison, vous pouvez aussi simplement écrire

 console.log = jest.fn()
expect(console.log).toHaveBeenCalled();
 

29voto

nickb Points 861

J'ai trouvé que la réponse ci-dessus re: suppression de console.log dans toutes les suites de test a jeté les erreurs lors de toute autre console méthodes (par exemple, warn, error) ont appelé, car il a été le remplacement de l'ensemble des console objet.

Cette approche un peu similaire a fonctionné pour moi avec la Plaisanterie 22+:

package.json

"jest": {
  "setupFiles": [...],
  "setupTestFrameworkScriptFile": "<rootDir>/jest/setup.js",
  ...
}

jest/setup.js

jest.spyOn(global.console, 'log').mockImplementation(() => jest.fn());

En utilisant cette méthode, seulement console.log fait l'objet des moqueries et autres console méthodes ne sont pas affectés.

13voto

Michael Liquori Points 269

Pour moi, une méthode plus claire / plus claire (le lecteur a besoin de peu de connaissances de l’API jest pour comprendre ce qui se passe), c’est de faire manuellement ce que mockRestore fait:

 // at start of test you want to suppress
const consoleLog = console.log;
console.log = jest.fn();

// at end of test
console.log = consoleLog;
 

0voto

Wallace Sidhrée Points 2229

Une autre approche consiste à utiliser des process.env.NODE_ENV. De cette façon, on peut choisir ce que pour montrer (ou pas) lors de l'exécution des tests:

if (process.env.NODE_ENV === 'development') {
  console.log('Show output only while in "development" mode');
} else if (process.env.NODE_ENV === 'test') {
  console.log('Show output only while in "test" mode');
}

ou

const logDev = msg => {
  if (process.env.NODE_ENV === 'development') {
    console.log(msg);
  }
}
logDev('Show output only while in "development" mode');

Cela nécessitera de cette configuration pour être placé sur package.json:

"jest": {
  "globals": {
    "NODE_ENV": "test"
  }
}

Notez que cette approche n'est pas une solution directe à la question d'origine, mais il donne le résultat attendu aussi longtemps que l'on a la possibilité d'envelopper l' console.log avec la condition.

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