【发布时间】:2020-09-21 18:14:34
【问题描述】:
我正在尝试使用lodash-es 包。由于它是一个 ES6 模块,因此 Babel 将其转译为 Jest。
Babel 配置是:
{
"env": {
"test": {
"plugins": [
"babel-plugin-rewire",
"@babel/plugin-transform-modules-commonjs",
"@babel/plugin-transform-runtime"
],
"ignore": [
"i18n/*.js"
]
}
}
}
但我已经得到了
Function.prototype.toString 要求 'this' 是 toString 处的函数
我尝试运行测试时出错。
我找到了错误所在的file,看起来像
Object.prototype.hasOwnProperty 是undefined。
我已经包含了下面代码的特定部分。
var funcProto = Function.prototype, objectProto = Object.prototype;
var funcToString = funcProto.toString;
var hasOwnProperty = objectProto.hasOwnProperty;
var reIsNative = RegExp('^' +
// here hasOwnProperty is undefined leading to the error
funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')
.replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
);
这是一个奇怪的错误。我尝试在node 中运行Object.prototype.hasOwnProperty,它工作正常。在这种情况下,我试图弄清楚它对undefined 的评估结果如何。
【问题讨论】:
-
为什么你认为
hasOwnProperty与Function.prototype.toString有任何关系?你有没有显示的代码? -
@appleapple 它是 node_module 中的一个文件。当我执行
yarn test时发生错误。我尝试做console.error(objectProto),但这并没有出现在控制台中。但它不能未定义,因为objectProto.hasOwnProperty 没有导致错误。 -
哦,我想你的意思是
objectProto.hasOwnPropert不能是undefined,对不起。 -
Lodash 代码被编写为无故障。 Function.prototype.toString 和 Object.prototype.hasOwnProperty 应该存在于任何合理的 JS 引擎中。你有这个问题意味着两件事,要么是这些原型被搞砸了,要么代码被 Babel 转换为 objectProto 不是指 Object.prototype 而是其他东西的方式。在这一点上,没有stackoverflow.com/help/mcve 就无法回答这个问题。根据您发布的内容,首先要怀疑的是 plugin-transform-runtime。
-
将
console.log(eval('Object.prototype') === objectProto)添加到那个地方,以确保它是否是 Babel 的错。 console.log 是一种低效的调试方式,您可以在 Node 中使用 Chrome 进行调试。这包括 Jest,例如node --inspect-brk node_modules/jest/bin/jest.js。对于 MCVE,您需要从当前设置派生的最简单的项目,并且仍然可以重现问题。
标签: javascript ecmascript-6 jestjs babeljs