You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Jest中正确断言抛出错误?类实例化测试失败排查

问题:测试未定义url时抛出错误的用例失败,哪里错了?

我想编写测试用例,断言当类属性this.url未定义时会抛出错误,但测试运行失败,请问问题出在哪?

测试代码

it('should throw an error if url is not provided by default', async () => {
  // Given
  const Service = require('./services/websocket')

  // When
  const Websocket = new Service()

  // Then
  expect(Websocket.url).toBeUndefined()
  expect(Websocket).toThrowError('Websocket URL is not provided')
})

Websocket类代码

// services/websocket.js
class Websocket {
  constructor () {
    this.url = undefined

    if (!this.url) {
      throw new TypeError('Websocket URL is not provided')
    }
  }
}
module.exports = Websocket

Jest错误信息

FAIL  terminal.test.js
  Websocket service provider
    ✕ should throw an error if url is not provided by default (2 ms)

  ● Websocket service provider › should throw an error if url is not provided by default

    TypeError: Websocket URL is not provided

      4 |
      5 |     if (!this.url) {
    > 6 |       throw new TypeError('Websocket URL is not provided')
        |             ^
      7 |     }
      8 |   }
      9 | }

      at new Websocket (services/websocket.js:6:13)
      at Object.<anonymous> (terminal.test.js:7:23)

问题原因

你的写法有两个核心问题:

  1. 执行const Websocket = new Service()时,构造函数直接抛出错误,代码根本走不到后续的expect断言,Jest捕获到这个未被预期的错误导致测试失败。
  2. expect(Websocket).toThrowError()用法错误,toThrowError需要断言的是会抛出错误的函数,而非已经实例化完成的对象。

修正后的测试代码

测试构造函数抛出错误,需要把实例化逻辑包裹在函数里传给expect,不能直接执行实例化:

it('should throw an error if url is not provided by default', () => {
  // Given
  const Service = require('./services/websocket')

  // Then - 断言构造函数执行时会抛出指定错误
  expect(() => new Service()).toThrowError('Websocket URL is not provided')
})

另外不需要expect(Websocket.url).toBeUndefined()这个断言,因为构造函数抛出错误时,实例根本不会被创建,这行代码永远不会被执行到。

内容的提问来源于stack exchange,提问作者aspirinemaga

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:00:59