6
votes

Est-il possible de désactiver les avertissements React spécifiques de Jest (à l'aide de l'application Create React)

Récemment, React a commencé à émettre des avertissements d'amortissement pour la méthode de cycle de vie componentWillReceiveProps . J'utilise une bibliothèque qui a utilisé cette fonction et les responsables n'ont pas encore mis à jour leur base de code.

Actuellement, chaque fois que j'exécute mes tests, que ce soit en développement ou en CI, je reçois toujours environ 30 lignes d'avertissement de dépréciation pour chaque composant fourni par le responsable.

Existe-t-il un moyen de supprimer ces avertissements (au moins en cours de développement)?

ÉDITER:

Je suis prêt à ajouter certains commentaires dans mes fichiers pour désactiver les avertissements d'un package spécifique s'il y a une chance:

// some line to disable warnings for this package
import { DateRangePicker } from 'react-dates';


6 commentaires

Vous pouvez essayer de remplacer console.warn


Cela supprimera les avertissements partout. Je ne pense pas que ce soit une bonne idée. Lorsque je le remplace dans mes fichiers de test, rien ne se passe.


Avez-vous essayé avec le paramètre --silent pour Jest?


marquez ces méthodes UNSAFE_. c'est-à-dire que votre composantWillReceiveProps deviendra UNSAFE_componentWillReceiveProps. essaye ça. Je pense que cela vous débarrassera de ces avertissements.


@HarshitAgarwal ce n'est pas ma bibliothèque; alors, je ne peux pas le faire.


@Daniele mais cela désactive tous les avertissements. Je n'ai besoin de désactiver que cet avertissement. Ou seulement des avertissements pour un package spécifique.


3 Réponses :


10
votes

Si vous souhaitez désactiver tous les avertissements qui remplissent certaines conditions, en conservant tous les autres avertissements, pour tous les tests:

const originalWarn = console.warn.bind(console.warn)
beforeAll(() => {
  console.warn = (msg) => 
    !msg.toString().includes('componentWillReceiveProps') && originalWarn(msg)
})
afterAll(() => {
  console.warn = originalWarn
})

React codebase contient également expect(render(...)).toWarnDev(...) , mais ce n'est pas inclus dans la documentation de Jest , vous devrez peut-être enquêter davantage si vous souhaitez utiliser cette fonctionnalité.


3 commentaires

où dois-je mettre le code fourni? car si je copie / colle le code exactement dans mon fichier de classe, il y a des erreurs.


@LukeCarelsen dans le fichier qui contient les tests, voir la documentation Setup and Teardown Jest


Je pense qu'il manque une parenthèse sur ton code



1
votes

J'ai donc trouvé un moyen de corriger ces avertissements pour n'importe quelle bibliothèque en utilisant react-codemod. Étant donné que cette bibliothèque ne fonctionne pas à l'intérieur de node_modules, vous devez donc faire un petit hack.

Courir:

./node_modules/react-dates/lib/** // or any library with issue
  • Supprimer / commenter la ligne (72)>
    ./node_modules/.bin/react-codemod rename-unsafe-lifecycles
    

Courir:

+ // args.push('--ignore-pattern=/node_modules/');

À cette question répondez avec le chemin de la bibliothèque, vous voulez corriger ...

«Sur quels fichiers ou répertoire les codemods doivent-ils être appliqués?»

 yarn add -D react-codemod
 open ./node_modules/react-codemod/bin/cli.js

Cela pourrait être un correctif temporaire jusqu'à ce que react-codemod supporte les bibliothèques node_modules. Vous pouvez également bifurquer la bibliothèque et supprimer la ligne pour vous-même et l'utiliser comme ceci dans votre pipeline CI pour ne plus recevoir d'avertissements comme celui-ci.


1 commentaires

Je déconseille fortement de modifier quoi que ce soit dans node_modules. Cela nécessiterait de vérifier dans votre répertoire node_modules, ce que vous ne devriez normalement pas faire non plus. Bifurquer la bibliothèque est bien, mais utiliser jest.spyOn pour ignorer le message est une bien meilleure idée.



1
votes

Un concept similaire à une réponse précédente, mais un peu plus simple serait:

let consoleSpy;

beforeAll(() => {
  consoleSpy = jest.spyOn(global.console, 'warn').mockImplementation((message) => {
    // same implementation as above
});

afterAll(() => consoleSpy.mockRestore());

Si vous vouliez le faire sur plusieurs tests, vous pourriez faire:

jest.spyOn(global.console, 'warn').mockImplementationOnce((message) => {
  if (!message.includes('componentWillReceiveProps')) {
    global.console.warn(message);
  }
});


0 commentaires