最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Running tests with ES6 import statements node - Stack Overflow

programmeradmin0浏览0评论

I'm using node v15.0.1, and jest 26.6.0 on ubuntu 18.04.5.

I have setup a simple test case, and at the top of the file I'm trying to use an ES6 import statement:

import Color from './color.js'

test("Initialized properly after construction", () => {
    expect(1 + 1).toBe(2);
});

Additionally, here's the code for color.js:

class Color {
    constructor(r, g, b, a) {
        this.r = r;
        this.g = g;
        this.b = b;
        this.a = a;
    }
}

export {
    Color
};

When I run jest I get the following error output:


 FAIL  src/modules/color.test.js
  ● Test suite failed to run

    Jest encountered an unexpected token

    This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.

    By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

    Here's what you can do:
     • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     • If you need a custom transformation specify a "transform" option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    .html

    Details:

    /home/daniel/Documents/raycaster/src/modules/color.test.js:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Color from './color.js'
                                                                                             ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at new Script (node:vm:100:7)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.288 s
Ran all test suites.
npm ERR! code 1

Based on the Jest documentation , I have added the following to my package.json file:

"type": "module",
"jest": {
        "testEnvironment": "jest-environment-node",
        "transform": {}
}

Despite these configurations it appears that jest is unable to run in an ES6 pliant mode. What configurations would I need to do to enable the import statements?

I'm using node v15.0.1, and jest 26.6.0 on ubuntu 18.04.5.

I have setup a simple test case, and at the top of the file I'm trying to use an ES6 import statement:

import Color from './color.js'

test("Initialized properly after construction", () => {
    expect(1 + 1).toBe(2);
});

Additionally, here's the code for color.js:

class Color {
    constructor(r, g, b, a) {
        this.r = r;
        this.g = g;
        this.b = b;
        this.a = a;
    }
}

export {
    Color
};

When I run jest I get the following error output:


 FAIL  src/modules/color.test.js
  ● Test suite failed to run

    Jest encountered an unexpected token

    This usually means that you are trying to import a file which Jest cannot parse, e.g. it's not plain JavaScript.

    By default, if Jest sees a Babel config, it will use that to transform your files, ignoring "node_modules".

    Here's what you can do:
     • To have some of your "node_modules" files transformed, you can specify a custom "transformIgnorePatterns" in your config.
     • If you need a custom transformation specify a "transform" option in your config.
     • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the "moduleNameMapper" config option.

    You'll find more details and examples of these config options in the docs:
    https://jestjs.io/docs/en/configuration.html

    Details:

    /home/daniel/Documents/raycaster/src/modules/color.test.js:1
    ({"Object.<anonymous>":function(module,exports,require,__dirname,__filename,global,jest){import Color from './color.js'
                                                                                             ^^^^^^

    SyntaxError: Cannot use import statement outside a module

      at new Script (node:vm:100:7)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        0.288 s
Ran all test suites.
npm ERR! code 1

Based on the Jest documentation https://jestjs.io/docs/en/ecmascript-modules, I have added the following to my package.json file:

"type": "module",
"jest": {
        "testEnvironment": "jest-environment-node",
        "transform": {}
}

Despite these configurations it appears that jest is unable to run in an ES6 pliant mode. What configurations would I need to do to enable the import statements?

Share Improve this question edited Oct 22, 2020 at 22:57 skyboyer 23.8k7 gold badges62 silver badges71 bronze badges asked Oct 22, 2020 at 21:55 DanielDaniel 1912 gold badges2 silver badges7 bronze badges 2
  • kindly share the content of color.js – chyke007 Commented Oct 22, 2020 at 22:00
  • @chyke007 have added the contents of color.js now – Daniel Commented Oct 22, 2020 at 22:05
Add a ment  | 

3 Answers 3

Reset to default 4

I found Node v13 / Jest / ES6 — native support for modules without babel or esm

which highlighted the piece that I needed:

In my package.json file, I needed to specify the following:

"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js"

As the reference states,

babel-jest is automatically installed when installing Jest and will automatically transform files if a babel configuration exists in your project. To avoid this behavior, you can explicitly reset the transform configuration option:

<...>

transform: {},

This is exactly what this config does, it disables Babel and prevents import from being transpiled.

The solution is to remove transform: {} and use transform only on purpose.

The mentioned reference section is dedicated to native ES module support in Node. It suggests that transform: {} requires to enable them with:

node --experimental-vm-modules node_modules/.bin/jest

This cannot be remended for regualr use as ESM support in both Node and Jest is experimental, may cause issues and lack features as Jest already heavily relies on CommonJS modules.

Since you are importing the class as a default export, you need to a default value. For more insight check this out https://developer.mozilla/en-US/docs/web/javascript/reference/statements/export

 class Color {
            constructor(r, g, b, a) {
                this.r = r;
                this.g = g;
                this.b = b;
                this.a = a;
            }
        }
    
        export default  Color;
发布评论

评论列表(0)

  1. 暂无评论