web-dev-qa-db-fra.com

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 inside a 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!

16
Apidcloud

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();
23
Andreas Köberle

Andreas est suffisant pour les fichiers 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",
};
16
Raja Jaganathan

J'ai trouvé que la réponse ci-dessus concernant la suppression de console.log dans toutes les suites de tests générait des erreurs lorsque d'autres méthodes console (par exemple, warn, error) étaient appelées, car elles remplaçaient l'objet global console complet.

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

package.json

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

jest/setup.js

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

Avec cette méthode, seul console.log est simulé et les autres méthodes console ne sont pas affectées.

11
nickb

Une autre approche consiste à utiliser process.env.NODE_ENV. De cette façon, on peut choisir de manière sélective ce qu'il faut afficher (ou non) lors de l'exécution de 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 que cette configuration soit placée sur package.json:

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

Notez que cette approche n’est pas une solution directe à la question initiale, mais donne le résultat attendu tant que l’on a la possibilité d’envelopper le console.log avec la condition mentionnée.

0
Wallace Sidhrée