测试 Object.hasOwnProperty

Sup*_*miu 2 javascript code-coverage jasmine

我有一个代码实现,它遍历 anobject的属性。

for (const prop in obj) {
    propsMap[prop] = prop;
}
Run Code Online (Sandbox Code Playgroud)

但正如状态一样,我的 IDE (WebStorm) 建议我添加一个属性检查,obj.hasOwnProperty(prop)以避免迭代不存在的属性:

for (const prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        propsMap[prop] = prop;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是当前的测试总是伴随着obj.hasOwnProperty(prop)存在true,并且覆盖率不是我能得到的最好的,我不知道如果obj实际上没有属性会发生什么prop

Yur*_*nko 6

要对此进行测试,您可以创建从其原型继承某些内容的对象

const obj = Object.create({name: 'inherited'})
Run Code Online (Sandbox Code Playgroud)

name将伪造obj.hasOwnProperty('name')检查。

但是有更好的选择来复制对象。例如Object.assign

Object.assign(propsMap, obj)
Run Code Online (Sandbox Code Playgroud)

您还应该记住,obj.hasOwnProperty检查很容易出错。例如

const obj = {hasOwnProperty: null} // hasOwnProperty is not a function
const obj = Object.create(null) // obj wont inherit hasOwnProperty 
Run Code Online (Sandbox Code Playgroud)

所以至少将其替换为

const hasOwnProperty = {}.hasOwnProperty

for(const name in obj) {
  if(hasOwnProperty.call(obj, name)) {

  }
Run Code Online (Sandbox Code Playgroud)