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

如何用Jest测试Mock函数是否调用了枚举中的某一值?

实现Jest验证Mock函数调用值属于枚举/允许列表的测试用例

当然可以实现你想要的测试行为,Jest内置的expect.oneOf匹配器正好能满足这个需求,你给出的示例代码本身就是正确的写法,直接运行就能通过测试。

基础字符串列表场景

你的示例代码已经正确使用了expect.oneOf,当Mock函数被调用时传入的参数属于指定列表中的值,测试就会通过:

test("called with one of a, b, or c", () => {
  let someMock = jest.fn()
  someMock("c")
  // 这个断言完全有效,会通过测试
  expect(someMock).toHaveBeenCalledWith(expect.oneOf(["a", "b", "c"]))
})

如果调用Mock时传入了不在列表中的值(比如"d"),这个断言会直接抛出错误,符合预期。

结合枚举的场景

如果你的允许值是用枚举定义的,不管是字符串枚举还是数字枚举,都可以把枚举值转换成数组传入expect.oneOf,这样更便于维护:

字符串枚举示例

enum AllowedValues {
  A = "a",
  B = "b",
  C = "c"
}

test("called with one of the allowed enum values", () => {
  const someMock = jest.fn();
  someMock(AllowedValues.C);
  
  // 将枚举值转为数组传入oneOf
  expect(someMock).toHaveBeenCalledWith(expect.oneOf(Object.values(AllowedValues)));
})

数字枚举示例

数字枚举的Object.values会同时返回数值和对应的字符串键名,需要过滤出纯数值类型的枚举值:

enum NumericAllowed {
  X,
  Y,
  Z
}

test("called with valid numeric enum value", () => {
  const mockFn = jest.fn();
  mockFn(NumericAllowed.Y);
  
  // 过滤出数字类型的枚举值
  const validEnumValues = Object.values(NumericAllowed).filter(v => typeof v === 'number');
  expect(mockFn).toHaveBeenCalledWith(expect.oneOf(validEnumValues));
})

expect.oneOf是Jest官方提供的匹配器,专门用于验证目标值是否属于指定的候选值列表,完全适配你需要的测试场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:55:25