当我将 KnockoutJS 导入我正在测试的 ViewModel 时,为什么会出现最大调用堆栈大小的 Jest 错误?

Gav*_*vin 9 javascript testing jestjs babeljs

我正在尝试使用 Jest 为 KnockoutJs 项目编写一些测试。

为我在下面弄错的任何术语道歉 我在大约 10 年没有使用 JS 之后又回到 JS 并且仍然让我的头脑围绕 ES6 模块之类的东西。

测试工作正常,直到我需要测试使用淘汰赛可观察对象的 ViewModel,我已经向我的视图模型添加了一个导入,以使用 ES6 模块语法引入 KnockoutJs 并设置了 babel 来编译它,因此它应该在 node.js 中工作。

我的视图模型看起来像这样......

export { myVm }
import * as ko from 'knockout'

function myVm() {
    var self = this;

    self.helloWorld = function () { return "Hello World" }

    return self;
}
Run Code Online (Sandbox Code Playgroud)

然后我的测试文件看起来像......

import * as vm from '../src/viewModels/myVm'

test('Returns Hello World', () => {
    expect(vm.myVm().helloWorld()).toBe('Hello World');
});
Run Code Online (Sandbox Code Playgroud)

当我执行 Jest 时,出现最大调用堆栈大小超出错误

错误截图

如果我从 ViewModel 中删除 import * as ko 行,它可以正常工作,但是我无法引用淘汰库中的任何对象类型。

不确定它是否相关,但我的 .babelrc 看起来像这样......

{
    "presets": [
        "env"
    ]
}
Run Code Online (Sandbox Code Playgroud)

知道将 Knockout 导入 ViewModel 时我做错了什么吗?

编辑:这是我的 package.json

{
  "name": "blah",
  "version": "1.0.0",
  "description": "blah",
  "main": "index.js",
  "dependencies": {
    "knockout": "^3.5.1"
  },
  "devDependencies": {
    "babel-jest": "^24.9.0",
    "babel-preset-env": "^1.7.0",
    "jest": "^24.9.0"
  },
  "scripts": {
    "test": "jest"
  },
  "author": "",
  "license": "ISC"
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ras 6

您使用的是比 Babel 7 更旧的版本,并且在导入语法时看起来有问题* as ko

您可以升级到Babel 7,一切都会像您拥有的那样工作,或者只是更改:

import * as ko from 'knockout'
Run Code Online (Sandbox Code Playgroud)

到:

import ko from 'knockout'
Run Code Online (Sandbox Code Playgroud)

升级巴别塔

关于如何升级 Babel 有很多资源,但这并不难。安装最新的 Babel@babel/core@babel/preset-env

npm install -D @babel/core @babel/preset-env

// OR

yarn add @babel/core @babel/preset-env --dev

Run Code Online (Sandbox Code Playgroud)

然后将内容更改.babelrc为新的,@babel/preset-env如下所示:

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}
Run Code Online (Sandbox Code Playgroud)

您可以省略target,但您应该始终使用它来最大限度地减少包含的填充内容:

{
  presets: ['@babel/preset-env']
}
Run Code Online (Sandbox Code Playgroud)