2017-07-11 1 views
0

Quelqu'un at-il été en mesure de Highcharts de tests unitaires avec mocha. Tout fonctionne très bien lorsque nous déployons notre code, mais il semble qu'il ne soit pas possible de charger le package highchart en dehors du navigateur. Notre code repro est Typescript, donc nous utilisons ts-node pour transiter vers commonJS, et lancer des tests avec mocha et Domino pour simuler la fenêtre/document, que nous utilisons pour tester nos autres composants React.Erreur lors de l'importation Highchart à l'intérieur test unitaire mocha

Plus précisément, les effets secondaires de l'importation appelant déclenche la TypeError:

import * as _Highcharts from 'highcharts'; 

qui déclenche cette trace de la pile:

TypeError: Cannot set property 'hcTimezoneOffset' of undefined 
at A (<MyPath>/node_modules/highcharts/highcharts.js:113:299) 
at <MyPath>/node_modules/highcharts/highcharts.js:119:497 
at <MyPath>/node_modules/highcharts/highcharts.js:119:502 
at a (<MyPath>/node_modules/highcharts/highcharts.js:8:83) 
at Object.<anonymous> (<MyPath>/node_modules/highcharts/highcharts.js:8:109) 
at Module._compile (module.js:569:30) 
at Module._extensions..js (module.js:580:10) 
at Object.require.extensions.(anonymous function) [as .js] (<MyPath>/node_modules/ts-node/src/index.ts:373:14) 

Ce qui fait référence à cet extrait de code.

<MyPath>/node_modules/highcharts/highcharts.js:113 
a.defaultOptions.global,k=q.moment;if(g.timezone){if(k)return function(a){return-k.tz(a,g.timezone).utcOffset()};a.error(25)}return g.useUTC&&g.getTimezoneOffset}function A(){var g=a.defaultOptions.global,u,h=g.useUTC,e=h?"getUTC":"get",n=h?"setUTC":"set";a.Date=u=g.Date||q.Date;u.hcTimezoneOffset=h&&g.timezoneOffset;u.hcGetTimezoneOffset=C();u.hcMakeTime=function(a,c,e,b,n,g){var d;h?(d=u.UTC.apply(0,arguments),d+=m(d)):d=(new u(a,c,k(e,1),k(b,0),k(n,0),k(g,0))).getTime();return d};F("Minutes Hours Day Date Month FullYear".split(" "), 

Le code est un peu difficile à suivre minified, mais ressemble à la cause racine est a.defaultOptions.global est indéfini pour une raison quelconque. Je suis en train de creuser plus loin, mais curieux si quelqu'un d'autre a eu une configuration similaire à travailler. Il est probable que notre fenêtre de test Domino porte à confusion le code higraphts.

Répondre

3

unminfying Ainsi, le code Highcharts me conduire à la réponse. Le bloc défaillant est ici.

var g = a.defaultOptions.global, 
    u, h = g.useUTC, 
    e = h ? "getUTC" : "get", 
    n = h ? "setUTC" : "set"; 
    a.Date = u = g.Date || q.Date; 
    u.hcTimezoneOffset = h && g.timezoneOffset; 

Les DefaultOptions globaux sont initialisés comme si, ce qui est important de noter, aucune clé de date est toujours définie, ni nulle part ailleurs que je peux voir.

global: { 
    useUTC: !0, 
    VMLRadialGradientURL: "http://code.highcharts.com/5.0.12/gfx/vml-radial-gradient.png" 
} 

On dirait qu'il suppose qu'il trouvera une clé de date dans les GlobalOptions ou sur q.Date, et q est réglé sur la fenêtre. Notre fenêtre domino exposait maintenant une méthode Date pour imiter une fenêtre de navigateur native. Ajouter cela semble faire en sorte que tout se passe bien. Pas l'échec le plus intuitif cependant.

Ce serait bien si l'importation n'a pas eu tant d'effets secondaires.

0

Dans mon cas, il semble que les conflits d'Highchart et JSDOM que j'utilise pour les tests. objet fenêtre fourni par JSDOM manque d'objet Date, donc je vient d'ajouter

global.window.Date = Date; 

et Highcharts importation a réussi.