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

Jest中检测函数抛出含指定文本错误?为何stringContaining失效?

为什么Jest的expect.stringContaining在toThrow中不生效?

我来帮你理清这个问题:

首先明确你的场景:
你定义了这个抛出错误的函数:

function foo() { throw new Error('an error from (foo)'); }

尝试用expect(() => foo()).toThrow(expect.stringContaining('(foo)'))验证错误消息包含(foo),但测试失败,报错显示Jest把expect.stringContaining当成了要匹配的错误实例,而非消息的匹配规则。

问题根源

这是因为Jest的toThrow(包括别名toThrowError)对参数的处理逻辑有明确规则:

  • 传字符串:会完全匹配错误的message属性
  • 传正则表达式:会用正则匹配错误的message
  • 传错误构造函数/实例:会匹配错误的类型(或类型+消息)
  • 但传不对称匹配器(比如expect.stringContaining、expect.objectContaining)时,它会默认尝试匹配整个错误对象,而不是错误的message字符串。

expect.stringContaining是用来匹配字符串的,自然无法匹配一个Error对象,这就是测试失败的核心原因。

解决办法

不用正则转义也能实现需求,推荐两种方式:

  1. 手动捕获错误断言消息(兼容性更好,逻辑直观)
test('checks error containing text', () => {
  // 先确保函数确实会抛出错误
  expect(() => foo()).toThrow();
  
  try {
    foo();
  } catch (error) {
    // 直接对错误消息使用stringContaining匹配器
    expect(error.message).toEqual(expect.stringContaining('(foo)'));
  }
});
  1. 用toThrowError配合匹配器(Jest较新版本支持,写法更简洁)
test('checks error containing text', () => {
  expect(() => foo()).toThrowError(expect.stringContaining('(foo)'));
});

这两种方式都能避免正则转义的麻烦,精准匹配消息中的目标文本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 15:22:38