Jest是否支持RSpec式aggregating failures?求推荐相关库
Jest 聚合失败功能的替代方案
你说得没错,Jest原生确实没有像RSpec里aggregating failures那样的内置功能——默认情况下,Jest会在遇到第一个失败断言后就立刻停止当前测试用例的执行,没法一次性看到这个用例里所有失败的断言结果。不过社区有不少第三方库可以完美解决这个需求,下面给你推荐两个最常用的:
推荐的第三方库
jest-assert-all
这个库就是专门为实现RSpec式的聚合失败而生的,它能把一组断言包裹起来,即使其中多个断言失败,也会执行完所有断言,最后一次性输出所有失败结果。
使用示例非常简单:
const assertAll = require('jest-assert-all'); test('测试多个断言的聚合失败', () => { assertAll(() => { expect(1).toBe(2); expect('foo').toBe('bar'); expect([1, 2, 3]).toHaveLength(4); }); });
执行这个测试后,你会一次性看到这三个断言的失败详情,而不是在第一个失败就中断测试。
jest-extended
这是一个功能非常丰富的Jest扩展库,除了提供大量实用的新断言方法外,它的assertAll方法也能实现聚合失败的效果。
使用示例:
const { assertAll } = require('jest-extended'); test('用jest-extended实现聚合失败', () => { assertAll([ () => expect(1).toBe(2), () => expect('hello').toBe('world'), () => expect(true).toBe(false), ]); });
如果你本来就需要扩展Jest的断言能力,这个库会是一举两得的选择。
手动实现方式(可选)
如果你不想引入第三方库,也可以用try/catch手动收集错误,不过这种方式比较繁琐,适合简单场景:
test('手动收集所有失败断言', () => { const failureErrors = []; try { expect(1).toBe(2); } catch (err) { failureErrors.push(err.message); } try { expect('a').toBe('b'); } catch (err) { failureErrors.push(err.message); } if (failureErrors.length > 0) { throw new Error(`共发现 ${failureErrors.length} 个断言失败:\n${failureErrors.join('\n')}`); } });
这种方式需要自己处理错误的收集和格式化,不如第三方库省心,所以还是更推荐使用前面提到的库。
内容的提问来源于stack exchange,提问作者jgiovaresco
相关产品推荐
相关产品推荐

