如何用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
相关产品推荐
相关产品推荐

