抛出错误,但Jest's 'toThrow()'未捕获错误

7dl7o3gd  于 2022-12-08  发布在  Jest
关注(0)|答案(4)|浏览(201)

下面是我的错误代码:

FAIL  build/__test__/FuncOps.CheckFunctionExistenceByString.test.js
  ● 
    expect(CheckFunctionExistenceByStr(
      'any string', 'FunctionThatDoesNotExistsInString'
    )).toThrow();

    Function FunctionThatDoesNotExistsInString does not exists in string.

      at CheckFunctionExistenceByStr (build/FuncOps.js:35:15)
      at Object.<anonymous> (build/__test__/FuncOps.CheckFunctionExistenceByString.test.js:12:51)
          at new Promise (<anonymous>)
          at <anonymous>

可以看到错误确实发生了:Function FunctionThatDoesNotExistsInString does not exists in string.。然而,在Jest中,它不会被捕获为一个传球。
下面是我的代码:

test(`
    expect(CheckFunctionExistenceByStr(
      'any string', 'FunctionThatDoesNotExistsInString'
    )).toThrow();
  `, () => {
    expect(CheckFunctionExistenceByStr(
      'any string', 'FunctionThatDoesNotExistsInString'
    )).toThrow();
  }
);
rryofs0p

rryofs0p1#

expect(fn).toThrow()需要一个函数fn当调用该函数时会引发异常。
但是,您正在立即调用CheckFunctionExistenceByStr,这会导致函数在运行Assert之前抛出。
替换

test(`
    expect(CheckFunctionExistenceByStr(
      'any string', 'FunctionThatDoesNotExistsInString'
    )).toThrow();
  `, () => {
    expect(CheckFunctionExistenceByStr(
      'any string', 'FunctionThatDoesNotExistsInString'
    )).toThrow();
  }
);

test(`
    expect(() => {
      CheckFunctionExistenceByStr(
        'any string', 'FunctionThatDoesNotExistsInString'
      )
    }).toThrow();
  `, () => {
    expect(() => {
      CheckFunctionExistenceByStr(
        'any string', 'FunctionThatDoesNotExistsInString'
      )
    }).toThrow();
  }
);
ubbxdtey

ubbxdtey2#

Jest在这里需要一个回调函数,而不是像下面这样传递函数定义:

expect(yourFunction(args)).toThrow(ErrorTypeOrErrorMessage)

请执行以下操作:

expect(() => yourFunction(args)).toThrow(ErrorTypeOrErrorMessage)

对于异步函数:

expect(async () => await yourFunction(args)).rejects.toThrow(ErrorTypeOrErrorMessage)

如果不需要传递参数,也可以执行以下操作:

expect(yourFunction).toThrow(ErrorTypeOrErrorMessage)
ntjbwcob

ntjbwcob3#

我有一个类似的问题,但我的函数测试是异步的,因此你的期望必须看起来像这样:
await expect(async () => {await myFunctionToBeTested();}).rejects.toThrow('My Error message')
我从这里得到的解决方案

  • 备注:*

我加上了“期待之前等待”,因为Eslint一直在抱怨,但没有它也能工作。

bakd9h0s

bakd9h0s4#

对我来说,问题是我测试的函数是一个getter,即使省略了()也会立即执行。将getter封装在闭包(() => {myClass.get})中解决了这个问题。

相关问题