【问题标题】:Why does Jest treat 'undefined' the same as Error?为什么 Jest 将“未定义”视为错误?
【发布时间】:2020-02-03 23:50:15
【问题描述】:

我正在编写一个单元测试,用于在未向对象提供某些参数时查找特定错误。作为我的测试设置的一部分,我将一个包含输入参数和预期错误消息的对象传递给它。在编写它们时,我为其中一个测试用例留下了所提供对象的预期错误消息。此测试应返回带有消息'Node process.env cannot be null' 的错误对象,它正在与.toThrow() 中的未定义对象进行比较。令我惊讶的是,这个测试仍然通过而不是抛出错误。 Jest 的.toThrow() 似乎将undefined 视为与我的错误消息相同的值。我正在使用 Jest 24.9.0 进行测试。

为什么这个测试通过了?这是由于 Typescript/Javascript 的行为造成的吗?这和 Jest 有关系吗?

it.each([
  [
    'missing event info',
    {
      event: undefined,
      env: getValidEnv(),
      expectedError: 'handler event cannot be null'
    }
  ],
  [
    'missing environment info',
    {
      event: getValidEvent(),
      env: undefined,
    }
  ]
])('should throw an error if (%s)', (testCaseName: any, params: any) => {
  const parser = new InputParser(params.event, params.env);
  expect(() => parser.getInputs()).toThrow(params.expectedError);
});

编辑:

附加说明:如果将params.expectedError 设置为空字符串'',也会发生同样的情况。

【问题讨论】:

  • 你确定 params.expectedError 不只是 undefined 出于某种原因吗?
  • 这是未定义的,这就是我的观点。 InputParser 抛出 Node.process.env cannot be null 错误,因为 params.expectedError 未定义,所以它不应该匹配。不过确实如此,所以单元测试通过了。

标签: javascript typescript jestjs


【解决方案1】:

toThrow 的参数是可选的。显式传递undefined 与只在没有参数的情况下调用它实际上是相同的,即xx.toThrow(undefined)xx.toThrow() 相同,它只是检查是否抛出了任何错误。当您抛出错误时,toThrow 会通过。

空字符串toThrow('') 的调用通过,因为当字符串作为参数传递时,jest 会检查 substring。由于'' 是任何字符串的子字符串,它通过了。见https://jestjs.io/docs/en/expect#tothrowerror

如果您想确保抛出了正确的错误,您可以使用toThrow(new Error('Node process.env cannot be null'))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 1970-01-01
    • 2021-09-28
    • 2020-09-28
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多