C3: Impossible d'exiger () à utiliser avec Jest

Créé le 7 août 2017  ·  13Commentaires  ·  Source: c3js/c3

TypeError: Cannot read property 'prototype' of undefined

      at ../../../../node_modules/c3/c3.js:2720:30
      at ../../../../node_modules/c3/c3.js:3263:3
      at Object.<anonymous>.CLASS.target (../../../../node_modules/c3/c3.js:2:82)
      at Object.<anonymous> (../../../../node_modules/c3/c3.js:5:2)

lequel est

        window.SVGPathElement.prototype.createSVGPathSegClosePath = function () {

Je ne sais pas trop où signaler cela. Jest, jsdom, ici ?

Commentaire le plus utile

@fernandes Compris . J'ai joué un peu plus avec et j'ai pu exécuter les tests d'instantanés en me moquant de c3 :

// __mocks__/c3.js
module.exports = () => 'c3';

puis dans la partie config Jest de mon package.json :

"moduleNameMapper": {
  "c3": "<rootDir>/__mocks__/c3.js",
}

Tous les 13 commentaires

Je reçois également cette erreur, je ne sais pas si c'est un problème avec c3 ou jsdom.

Créez un projet npm vide. Ensuite, essayez ceci :

npm i -S c3 jsom
node -e "var JSDOM = require('jsdom').JSDOM; global.window = new JSDOM().window; require('c3');"

Sortir:

/home/herinson/example/node_modules/c3/c3.js:2720
        window.SVGPathElement.prototype.createSVGPathSegClosePath = function () {
                             ^

TypeError: Cannot read property 'prototype' of undefined
    at /home/herinson/example/node_modules/c3/c3.js:2720:30
    at /home/herinson/example/node_modules/c3/c3.js:3263:3
    at CLASS.target (/home/herinson/example/node_modules/c3/c3.js:2:82)
    at Object.<anonymous> (/home/herinson/example/node_modules/c3/c3.js:5:2)
    at Module._compile (module.js:573:30)
    at Object.Module._extensions..js (module.js:584:10)
    at Module.load (module.js:507:32)
    at tryModuleLoad (module.js:470:12)
    at Function.Module._load (module.js:462:3)
    at Module.require (module.js:517:17)

Je n'avais pas cette erreur avant.
Probablement lié à ceci https://github.com/tmpvar/jsdom/pull/1445

Pensez-vous que nous pouvons simplement nous moquer de la propriété SVGPathElement ?

Je pense que c'est évidemment un problème avec l'implémentation SVG incomplète de jsdom (ce dont je ne les blâme pas ; cette merde a l'air d'être nulle)

Cependant, quelle serait une bonne solution de contournement? Je veux pouvoir tester unitairement un projet qui a C3 en tant que dépendance avec jsdom/jest, mais c'est un assez gros bloqueur. En fait, je n'ai pas besoin de tester à l'unité aucune des fonctionnalités de C3, donc je suppose que je pourrais l'écraser ...

Pensez-vous que nous pouvons simplement nous moquer de la propriété SVGPathElement ?

Ce serait une solution possible.

Je n'utilise même pas c3, mais probablement d'autres packages de mon projet le sont.
Mes tests fonctionnaient bien jusqu'à ce que je mette à jour un tas de dépendances. J'essaie toujours de comprendre quelle dépendance utilise c3.
PS : jsdom est présent dans mes fichiers de tests.

Trouvé ! Revenir à la version 3.4.1 de warm-js a « résolu » le problème. La dernière version est la 4.0.0.

Si quelqu'un rencontre le même problème que le mien, Keen a décidé de diviser son package principal en 3 packages séparés : https://github.com/keen/keen-js/releases/tag/v4.0.0

Le problème est que sharp-dataviz.js utilise c3.js. Je n'utilise pas de graphiques, donc pour mon cas, la solution est d'installer le suivi et de supprimer les js.

Je suis confronté au même problème en utilisant jest et en essayant de prendre un instantané d'un composant qui utilise react-c3js

    TypeError: Cannot read property 'prototype' of undefined

      at node_modules/c3/c3.js:2806:30
      at node_modules/c3/c3.js:3349:3

juste quelques différences sur le numéro de ligne, probablement liées à la construction (j'utilise la version c3 : 0.4.18)

mise à jour : window.SVGPathElement.prototype.createSVGPathSegClosePath = function () est la ligne ici aussi

ps: fonctionne parfaitement sur navigateur, juste à la blague arrive cette erreur

Pareil ici. Je crois que celui-ci répond pourquoi : https://github.com/tmpvar/jsdom/issues/1423

@brandonros
Si vous n'avez pas besoin de la fonctionnalité c3 dans vos cas de test de plaisanterie, je pense que vous pouvez remplacer SVGPathElement par un objet factice.

J'ai pu exiger c3.js dans un environnement de nœud en simulant window.SVGPathElement comme ci-dessous :

var JSDOM = require('jsdom').JSDOM;
global.window = new JSDOM().window;
window.SVGPathElement = function () {};
console.log(require('c3')); // => no error!

@fernandes Je suis confronté à un problème similaire. Avez-vous pu trouver une solution de contournement ?

salut @esonmez , je n'avais pas...

comme j'ai fait des recherches, jsdom n'implémente pas les trucs SVG dessus, c'est pourquoi je ne peux pas utiliser c3 sur les tests (qui utilise jdsom), j'ai juste isolé le composant c3 autant que possible et j'ai abandonné ce test heheh

@fernandes Compris . J'ai joué un peu plus avec et j'ai pu exécuter les tests d'instantanés en me moquant de c3 :

// __mocks__/c3.js
module.exports = () => 'c3';

puis dans la partie config Jest de mon package.json :

"moduleNameMapper": {
  "c3": "<rootDir>/__mocks__/c3.js",
}

hahaha c'est intéressant, merci d'avoir partagé l'astuce, je vais l'implémenter sur mon projet, merci !

J'étais ravi de résoudre ce problème en utilisant la suggestion de @esonmez , mais depuis que le projet sur

Out of the box, Create React App only supports overriding these Jest options:

  • collectCoverageFrom
  • coverageReporters
  • coverageThreshold
  • snapshotSerializers.

These options in your package.json Jest configuration are not currently supported by Create React App:

  • moduleNameMapper

If you wish to override other Jest options, you need to eject from the default setup. You can do so by running npm run eject but remember that this is a one-way operation. You may also file an issue with Create React App to discuss supporting more options out of the box.

Frustrant pour le moins. Dans tous les cas, dans notre fichier d'installation de plaisanterie, j'ai pu m'en moquer comme @kt3k l'a fait :

global.SVGPathElement = function () {}

Et cela a fonctionné comme un charme. Merci pour l'aide tous!

Pour les questions concernant l'interaction entre C3.js et toute autre bibliothèque (react, vuejs, ..), veuillez utiliser le groupe Google à l' adresse https://groups.google.com/forum/#!forum/c3js.

Merci!

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

Questions connexes

zachallia picture zachallia  ·  3Commentaires

MarcusJT picture MarcusJT  ·  4Commentaires

ivarkallejarv picture ivarkallejarv  ·  3Commentaires

alantygel picture alantygel  ·  3Commentaires

Saikat-Sinha picture Saikat-Sinha  ·  3Commentaires