Javascript 使用jest测试函数参数的默认情况

Javascript 使用jest测试函数参数的默认情况,javascript,jestjs,Javascript,Jestjs,在下面的代码片段中,如何在actualData函数中检查对象的默认大小写 当我运行jest覆盖率时,我得到的分支不是100%,因为我没有为对象默认情况编写测试用例 我怎么能查那个 请参阅下面的代码片段。感谢您的帮助:) //sample.js let data = { users: [ { terms: ["service|/users"], conditions: ["view", 'create'] }, { terms

在下面的代码片段中,如何在actualData函数中检查对象的默认大小写

当我运行jest覆盖率时,我得到的分支不是100%,因为我没有为对象默认情况编写测试用例

我怎么能查那个

请参阅下面的代码片段。感谢您的帮助:)

//sample.js

    let data = {
  users: [
    {
      terms: ["service|/users"],
      conditions: ["view", 'create']
    },
    {
      terms: ["service|/users-details"],
      conditions: ["view"]
    },
    {
      terms: ["service|/usersNew"],
      conditions: ["view"]
    },
    {
      terms: ["list|searchuser"],
      conditions: ["view"]
    },
    {
      terms: ["list|createuser"],
      conditions: ["view", "create"]
    },
    {
      terms: ["service|/user-contacts"],
      conditions: ["view"]
    },
    {
      terms: ["service|/user-location"],
      conditions: ["view"]
    },
    {
      terms: ["page|supplierlist|button|select"],
      conditions: ["enable"]
    },
    {
      terms:["page|supplierlist|button|create-new"],
      conditions: ["disable"]
    }
  ]
};


class Mapper{
  constructor(data){
    this.currentIndex = -1;
    this.data = this.extractData(data);
  }

  resolveData(terms, object={}, conditions){
    try{
      return terms.reduce((result, string) => {
        const [key, value] = string.split(/\|(.+)/);
        if (value && value.includes('|')) {
          result[key] = result[key] || {};
          this.resolveData([value], result[key], conditions);
        } else {
          result[key] = result[key] || [];
          this.currentIndex = this.currentIndex + 1;
          result[key].push({ [value]: conditions[this.currentIndex] });
        }
        return result;
      }, object);
    }catch(error){
      throw error
    }
  }


  extractData(data){
    try{
      let terms = data.users.map(o => o.terms)
      terms = [].concat(...terms);
      const conditions = data.users.map(o => o.conditions);
      return this.resolveData(terms, {}, conditions)
    }catch(error){
      throw error
    }
  }
}
//sample.test.js

 const Mapper = require('./Sample');


describe('Sample File test cases', () => {
    test('should throw an error', () => {
        const resolvedSample = {}
        expect(() => {
          const model = new Mapper(resolvedSample)
        }).toThrow(TypeError);
    })
})

这将使您获得该行的代码覆盖率:

test('resolveData should handle error', () => {
  const model = new Mapper({ users: [] });
  expect(() => { model.resolveData(); }).toThrow();
})
…话虽如此,您可能应该删除默认参数,因为
resolveData
总是与所有三个参数一起调用


您还可以从这两个函数中删除
try/catch
,因为
catch
除了抛出错误外,什么都不做。

实际数据应该做什么?对尚不存在的代码进行测试很难。更新了问题。因此我们不应该使用try-catch,我已经阅读了一些关于try-catch中应该包含哪些内容的文章。你能解释一下它是怎么工作的吗,比如说,当我们做toThrow的时候,它应该去抓块,还是我有点困惑this@DILEEPTHOMAS如果代码被包装在一个
try/catch
中,而
catch
只是抛出它刚刚捕获的错误,那么如果
try/catch
被删除,代码的行为将完全相同。因此,删除
try/catch
可以减少代码量并略微提高性能。(如果
catch
除了立即抛出刚刚捕获的错误外,还做了其他事情,那么它可能会很有用,值得保留)@DILEEPTHOMAS应答中的测试调用没有参数的
resolveData
,因此使用
object
的默认参数,它覆盖了
Jest
的代码覆盖率报告中的那一行。在没有参数的情况下调用
resolveData
会导致抛出错误,因此我将调用包装在
expect(…).toThrow()中太好了。我不熟悉单元测试。我对此有一些疑问,请您检查并帮助以适当的方式书写