mocha单元测试中的Highchart导入错误

时间:2017-07-11 18:18:08

标签: node.js typescript highcharts mocha commonjs

是否有人能够使用Highchartsmocha进行单元测试。在我们部署代码时,一切都很有效,但看起来可能无法在浏览器外加载highcharts软件包。

我们的代码repro是Typescript,所以我们使用ts-node转换为commonJS,并使用mocha和Domino运行测试来伪造窗口/文档,我们用它来测试我们的其他React组件。

特别是调用import的副作用会触发TypeError:

import * as _Highcharts from 'highcharts';

触发此堆栈跟踪:

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)

引用此代码段。

    <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(" "),

代码有点难以跟上缩小,但看起来根本原因a.defaultOptions.global无论出于何种原因都是undefined。我正在深入挖掘,但好奇是否有其他人已经得到了类似的设置。我们的测试Domino窗口可能会混淆highcharts代码。

2 个答案:

答案 0 :(得分:3)

因此,取消对高级代码的修改会让我得到答案。失败的块就在这里。

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;

全局defaultOptions被初始化为这样,重要的是要注意,没有设置Date键,也没有我能看到的任何其他地方。

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

看起来它假设它会在globalOptions或q.Date中找到Date键,并且q设置为窗口。我们的多米诺骨牌窗口现在公开了一个Date方法来模仿本机浏览器窗口。添加它似乎使一切运行顺利。虽然不是最直观的失败。

如果导入没有那么多副作用,会很好。

答案 1 :(得分:0)

就我而言,我正在使用Highchart和JSDOM进行测试。 JSDOM提供的Window对象缺少Date对象,所以我刚刚添加了

global.window.Date = Date;

和Highcharts导入成功。