我正在尝试使用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.*?') + '$'
);
这是一个奇怪的错误。我试过在Object.prototype.hasOwnProperty
中运行node
,它可以正常工作。我正在尝试弄清在这种情况下它如何评估undefined
。
经过数小时的调试,我发现了问题。
Babel从以下位置转换下面的代码段
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.*?') + '$'
);
转载至以下内容:
var funcProto = Function.prototype, objectProto = Object.prototype;
var funcToString = _get__("funcProto").toString;
var hasOwnProperty = _get__("objectProto").hasOwnProperty;
var reIsNative = RegExp('^' + _get__("funcToString").call(_get__("hasOwnProperty")).replace(_get__("reRegExpChar"), '\\$&').replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');
罪魁祸首是Babel如何引用其变量,但更重要的是,Lodash是如何使用属性命名其变量的。
hasOwnProperty
变量被引用为_get__("hasOwnProperty")
,这似乎删除了类似于众所周知的Object属性的变量名。
因此,_get__("hasOwnProperty")
为undefined
,而如果像hasOwnProperty
那样正常访问,则它的功能还可以。
因此,解决方法:
我刚刚将hasOwnProperty
重命名为hasOwnProp
和宾果游戏!有效。