javascript - 当我将 KnockoutJS 导入我正在测试的 ViewModel 时,为什么 Jest 会出现最大调用堆栈大小超出的错误?
问题描述
我正在尝试使用 Jest 为 KnockoutJs 项目编写一些测试。
对我在下面弄错的任何术语表示歉意,在大约 10 年没有使用 JS 并且仍然对 ES6 模块之类的东西感到头疼之后,我又回到了 JS。
测试工作正常,直到我需要测试一个使用敲除可观察对象的 ViewModel,我添加了一个导入到我的 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;
}
然后我的测试文件看起来像......
import * as vm from '../src/viewModels/myVm'
test('Returns Hello World', () => {
expect(vm.myVm().helloWorld()).toBe('Hello World');
});
当我执行 Jest 时,我得到一个最大调用堆栈大小超出错误
如果我从 ViewModel 中删除 import * as ko 行,它可以正常工作,但是我无法引用淘汰库中的任何对象类型。
不确定它是否相关,但我的 .babelrc 看起来像这样......
{
"presets": [
"env"
]
}
知道将 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"
}
解决方案
* as ko
您使用的是比 Babel 7 更早的版本,并且在导入语法时看起来有问题。
您可以升级到Babel 7,一切都会照常运行,或者只是更改:
import * as ko from 'knockout'
至:
import ko from 'knockout'
升级通天塔
有很多关于如何升级 Babel 的资源,但并不难。安装最新的 Babel@babel/core
和@babel/preset-env
:
npm install -D @babel/core @babel/preset-env
// OR
yarn add @babel/core @babel/preset-env --dev
然后将内容更改.babelrc
为具有这样的新内容@babel/preset-env
:
{
"presets": [
[
"@babel/preset-env",
{
"targets": {
"node": "current"
}
}
]
]
}
您可以省略target
,但您应该始终使用它来最小化包含的 polyfill:
{
presets: ['@babel/preset-env']
}