接近"窗口"在JSDom的Node测试环境中正确使用

时间:2016-03-15 11:31:13

标签: javascript node.js testing reactjs jsdom

我正在使用Tape和JSDom测试我的React应用程序,并在每个测试JS文件的顶部导入以下模块:

import jsdom from 'jsdom'

function setupDom() {
  if (typeof document === 'undefined') {
    global.document = jsdom.jsdom('<html><body></body></html>');
    global.window = document.defaultView;
    global.navigator = window.navigator;
    global.WebSocket = function(){};
  }
}

setupDom();

但是,在我的一个React组件中,我导入了pathseg polyfill,如下所示:

import 'pathseg'

但是,当我运行测试时,我收到此错误:

    SVGPathSeg.prototype.classname = "SVGPathSeg";
        ^

ReferenceError: SVGPathSeg is not defined

如果我去了错误的来源(在polyfill中),我看到:

(function() { "use strict";
if (!("SVGPathSeg" in window)) {
    // Spec: http://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSeg
    window.SVGPathSeg = function(type, typeAsLetter, owningPathSegList) {
        this.pathSegType = type;
        this.pathSegTypeAsLetter = typeAsLetter;
        this._owningPathSegList = owningPathSegList;
    }

    SVGPathSeg.prototype.classname = "SVGPathSeg";

我的问题是,我该如何解决这个问题呢?此外,我可以采用不同的方式处理我的测试设置以避免将来发生这种情况吗?

1 个答案:

答案 0 :(得分:1)

您的测试设置不应该在全局范围内粘贴窗口属性。 jsdom理论上可以处理这种情况 - 如果你正确使用它:

你应该向jsdom提供一个完整的测试包,就像你在浏览器中测试一样。这通常意味着您必须对测试进行浏览,然后将最终脚本文件提供给jsdom(就像您在普通浏览器中一样)。另请参阅该this评论/帖子。