汇总别名和Jest:从'src / index.js'中找不到模块'global / http'

时间:2020-05-13 16:01:34

标签: javascript jestjs alias rollup rollupjs

我在带有Rollup的项目中使用普通javascript。我正在使用,并且是第一次安装Jest,在对我的问题进行了一些研究之后,我有了一个基本的设置:

// jest.config.js
module.exports = {
  coverageDirectory: 'coverage',
  moduleFileExtensions: ['js'],
  moduleNameMapper: {
    '^applicationRoot/(.*)$': '<rootDir>/src/$1',
  },
};

我正在使用 rollup-plugin-alias 库,这是我的 rollup.config.js

中的示例
// rollup.config.js
// ...
alias({
      resolve: ['.js'],
      applicationRoot: __dirname + '/src',
      entries: [
        {
          find: 'global/http',
          replacement: `${__dirname}/src/global/http/index.js`,
        },
      ]})

我的图书馆中的所有类都位于 ./ src目录中。如果在我的输入文件( ./ src / index.js )中,则有以下几行:

// ./src/index.js
import Http from 'global/http';
export class MyClass {

}

在我的测试文件中,我有:

// ./src/index.spec.js
import { MyClass } from './index';

在终端中,出现以下错误:

 ● Test suite failed to run

    Cannot find module 'global/http' from 'src/index.js'

    Require stack:
      src/index.js
      src/index.spec.js
    > 1 | import Http from 'global/http';

我还应该做什么?感谢您的帮助或评论。

[已编辑]

我创建了一个虚拟存储库,其结构与上述类似:

https://github.com/luenmuvel/dummy-project-rollup-jest-issues

在这种情况下,他们要做的就是克隆项目并运行“ npm i ”或“ 纱线”。

在浏览器中它确实起作用: 您只需要运行:

  • npm运行版本”或“ 纱线版本​​
  • 在浏览器终端中查看输出。

开玩笑不起作用。 您只需要运行: -“ npm运行t ”或“ 纱线t ” -等待输出。

1 个答案:

答案 0 :(得分:0)

据我所知,问题是在您的.spec文件中,您导入的是原始文件,而不是已编译的文件。

已编译文件是一个汇总输出,具体取决于您的输出选项。例如,这是您的配置方式:

output: {
  file: "dist/bundle.js",
  format: "umd",
  name: "testing",
},

构建的文件位于dist/bundle.js,但是在您的.spec文件中您是这样导入的:

import MyClass from "./index";

不仅如此,您还使用了一些插件,这些插件会影响最终输出。

不确定此比较是否正确,但是就像您要从TS文件导入JS文件一样。您可能犯的错误几乎是相同的。

还请注意,index 没有没有默认导出

export class MyClass { }

我想出的解决方案是使用玩笑的moduleNameMapper optionindex.js映射到汇总将输出的文件:

// jest.config.js
module.exports = {
  coverageDirectory: "coverage",
  moduleFileExtensions: ["js"],
  moduleNameMapper: {
    "^applicationRoot/(.*)$": "<rootDir>/src/$1",
  },
  moduleNameMapper: {
    "./index.js": "../dest/bundle.js"
  }
};

spec文件将这样导入文件:

import { MyClass } from './index.js';