Jest: Certains tests de réussite échoueront lors de l'utilisation de l'indicateur --coverage

Créé le 8 déc. 2016  ·  3Commentaires  ·  Source: facebook/jest

Vous souhaitez demander une fonctionnalité ou signaler un bug ?

Bogue

Quel est le comportement actuel ?

L'exécution de npm test fait réussir tous les tests ; cependant, l'exécution de npm test -- --coverage provoque l'échec de certains tests.

Si le comportement actuel est un bogue, veuillez fournir les étapes à reproduire et si possible un référentiel minimal sur GitHub que nous pouvons npm install et npm test .

J'ai un projet contenant un certain nombre de composants réactifs que je teste à l'aide de plaisanteries et d'enzymes. Je nous ai récemment fait passer de [email protected] à [email protected] et de [email protected] à [email protected] . J'ai nettoyé le répertoire node_modules avant d'installer les nouvelles versions.

Je lance npm test et tous les tests réussissent. Lorsque j'exécute npm test -- --coverage , certains tests échouent et le rapport de couverture est généré.

Il semble que tous les échecs concernent un composant rendu peu profond avec une enzyme, puis utilisant find(selector) pour trouver des nœuds dans l'arbre de rendu. Les nœuds sont trouvés avec succès pendant jest , mais échouent pendant jest --coverage .

Avant la mise à niveau, tous les tests ont réussi pour jest et jest --coverage .

Dépôt : https://github.com/nsand/jest-coverage

Quel est le comportement attendu ?

Je m'attendrais à ce que tous les tests réussissent pour les deux exécutions.

Exécutez à nouveau Jest avec --debug et fournissez la configuration complète qu'il imprime.

node @ v6.9.1
npm @3.10.8
OS macOS Sierra

jest version = 17.0.3
test framework = jasmine2
config = {
  "coverageDirectory": "/Users/dev/workspaces/component-project/.gh-pages/coverage",
  "moduleNameMapper": [
    [
      "^.+\\.(scss)$",
      "/Users/dev/workspaces/component-project/lib/styleMock.js"
    ]
  ],
  "rootDir": "/Users/dev/workspaces/component-project",
  "name": "-Users-dev-workspaces-component-project",
  "setupFiles": [
    "/Users/dev/workspaces/component-project/node_modules/babel-polyfill/lib/index.js"
  ],
  "testRunner": "/Users/dev/workspaces/component-project/node_modules/jest-jasmine2/build/index.js",
  "transform": [
    [
      "^.+\\.jsx?$",
      "/Users/dev/workspaces/component-project/node_modules/babel-jest/build/index.js"
    ]
  ],
  "usesBabelJest": true,
  "automock": false,
  "bail": false,
  "browser": false,
  "cacheDirectory": "/var/folders/46/446113_55dgdfk3jsptqtd2c0000gn/T/jest",
  "coveragePathIgnorePatterns": [
    "/node_modules/"
  ],
  "coverageReporters": [
    "json",
    "text",
    "lcov",
    "clover"
  ],
  "expand": false,
  "globals": {},
  "haste": {
    "providesModuleNodeModules": []
  },
  "mocksPattern": "__mocks__",
  "moduleDirectories": [
    "node_modules"
  ],
  "moduleFileExtensions": [
    "js",
    "json",
    "jsx",
    "node"
  ],
  "modulePathIgnorePatterns": [],
  "noStackTrace": false,
  "notify": false,
  "preset": null,
  "resetMocks": false,
  "resetModules": false,
  "snapshotSerializers": [],
  "testEnvironment": "jest-environment-jsdom",
  "testPathDirs": [
    "/Users/dev/workspaces/component-project"
  ],
  "testPathIgnorePatterns": [
    "/node_modules/"
  ],
  "testRegex": "(/__tests__/.*|\\.(test|spec))\\.jsx?$",
  "testURL": "about:blank",
  "timers": "real",
  "transformIgnorePatterns": [
    "/node_modules/"
  ],
  "useStderr": false,
  "verbose": null,
  "watch": false,
  "collectCoverage": true,
  "cache": false,
  "watchman": true
}
Confirmed

Commentaire le plus utile

L'ajout de displayName à vos composants devrait résoudre le problème 😄

Istanbul encapsule les fonctions avec d'autres fonctions anonymes et nous prenons le nom de fonction que le nœud donne au composant rendu :( -- @cpojer https://github.com/facebook/jest/issues/1824#issuecomment -250376673

@nsand : Par exemple, votre composant Icon ressemblera maintenant à ceci :

import React from 'react';

const Icon = ({ name }) => (
  <i className={`fa-icon fa-icon--${name}`}></i>
);

Icon.displayName = 'Icon';

export default Icon;

Tous les 3 commentaires

@dmitriiabramov des idées sur pourquoi cela se produit-il ?

L'ajout de displayName à vos composants devrait résoudre le problème 😄

Istanbul encapsule les fonctions avec d'autres fonctions anonymes et nous prenons le nom de fonction que le nœud donne au composant rendu :( -- @cpojer https://github.com/facebook/jest/issues/1824#issuecomment -250376673

@nsand : Par exemple, votre composant Icon ressemblera maintenant à ceci :

import React from 'react';

const Icon = ({ name }) => (
  <i className={`fa-icon fa-icon--${name}`}></i>
);

Icon.displayName = 'Icon';

export default Icon;

@rogeliog Incroyable ! Merci. Je faisais du débogage il y a un peu et j'avais remarqué que si j'appelais children() sur le wrapper, il y avait une différence visible.

test npm

 [ { '$$typeof': Symbol(react.element),
           type: [Function: Icon],
           key: null,
           ref: null,
           props: [Object],
           _owner: null,
           _store: {} } ]

vs
test npm -- --couverture

[ { '$$typeof': Symbol(react.element),
           type: [Function],
           key: null,
           ref: null,
           props: [Object],
           _owner: null,
           _store: {} } ]

La différence est que Function est nommé pour npm test . Cela semble donc aller de pair avec ce que vous avez publié, et votre proposition résout effectivement le problème. Merci @thymikee et @rogeliog !

Cette page vous a été utile?
0 / 5 - 0 notes