如何在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)
问题原因
你的写法有两个核心问题:
- 执行
const Websocket = new Service()时,构造函数直接抛出错误,代码根本走不到后续的expect断言,Jest捕获到这个未被预期的错误导致测试失败。 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
相关产品推荐
相关产品推荐

