0

我试图弄清楚如何在我的 reactJS ES6 应用程序中进行单元测试。我的应用程序已经在使用 es6 模块系统,使用 jspm/babel 转换为 systemJs。

我发现 babel-jest 作为预处理器,但即使使用它,我也无法运行我的测试,因为 jest 找不到 SystemJs。(“系统未定义”错误显示在控制台中)

在浏览器中,如 jspm 文档中所述,SystemJs 是全局加载的。我想我应该在我的预处理器中加载 SystemJs,但是如何使 systemJs 可用于在我的测试中加载其他模块?

提前致谢

4

2 回答 2

0

不幸的是,Jest 目前不支持 SystemJS ES6 模块。

请参阅以下评论:

所以听起来像是开玩笑假设您的模块基于节点解析算法进行解析。

不幸的是,这与 SystemJS 的解析算法不兼容。

如果在 jest 中有一种方法可以通过 API 设置“自定义解析器”算法,那么我们可以将 jspm 插入 jest,但我不确定这目前是否可行。

——Guy Bedford 的评论,SystemJS 的创建者,2015 年 6 月


除非是社区贡献,否则不太可能有对 [SystemJS] 的官方支持。

-- Jest Collaborator @cpojer 评论,2016 年 1 月


另请参阅以下问题:Invalid URL is throwed when requires systemjs in jest test cases

于 2016-01-25T12:33:01.747 回答
0

本质上,要让 Jest 与在 JSPM/SystemJS 上运行的应用程序配合得很好,您需要“教”它在 config.js 文件中保存的所有映射(或者您调用 System.config())

答案是您需要为使用 JSPM 安装的每个依赖项创建一个条目,如下所示:

//jest configuration 
moduleNameMapper: {     
   ...
   "^redux$": "redux@3.6.0",
   ...
}

对于您拥有的每个别名,您至少需要一个条目:

moduleNameMapper: {     
        ...
        "^common\\/(.*)": "<rootDir>/src/common/$1", //for a dir alias
       "^actions$": "<rootDir>/src/actions/index", //for a file alias
       ...
}

您还需要在nodeNameMapper中有这些映射:

moduleNameMapper: {     
    ...
         "^npm:(.*)": "<rootDir>/jspm_packages/npm/$1",
            "^github:(.*)": "<rootDir>/jspm_packages/github/$1",
    ...
}

最后,你需要有这个moduleDirectories配置:

moduleDirectories: ["node_modules", "jspm_packages/npm", "jspm_packages/github"]

这不是很实用,因为您不想保留所有依赖项注册表的两个副本,并且在它们更改时必须同步它们......

所以简短更好的答案,你使用我的 gulp-jest-jspm插件:)

即使你不使用 gulp,你也可以在运行 Jest 之前使用它的getJestConfig()方法为你生成配置。

于 2016-12-20T19:29:03.953 回答