如何用Jest-TS基于Logger接口快速创建Mock函数?
用Jest内置工具快速搞出Azure Functions的Logger Mock
直接用jest.fn()+对象组合就行
你要的只是个符合接口的空实现,不用验证调用,完全没必要用第三方包,Jest自带的工具足够搞定。
第一步:搞个通用空函数
先弄个空函数,所有Logger的方法都复用它:
const noop = jest.fn();
第二步:拼出符合Logger接口的log对象
Logger接口比较特殊,既是个函数,又带error/warn这些方法,用Object.assign把空函数和方法属性拼一起就行:
const mockLogger = Object.assign(noop, { error: noop, warn: noop, info: noop, verbose: noop, }) as jest.Mocked<Logger>;
第三步:组装Context对象
把上面的mockLogger塞到Context里,按需加其他你需要的属性:
const mockContext = { log: mockLogger, // 比如bindingData、req这些属性,需要的话加空值或mock就行 } as unknown as Context;
嫌麻烦?一步到位的写法
不想拆步骤的话,直接写在一起:
const mockContext = { log: Object.assign(jest.fn(), { error: jest.fn(), warn: jest.fn(), info: jest.fn(), verbose: jest.fn(), }) as jest.Mocked<Logger>, } as unknown as Context;
为啥这方法好使?
jest.fn()本身就是空函数,调用不会报错,完全满足你“只要有效函数”的需求Object.assign刚好能解决Logger既是函数又是对象的特殊结构问题- 类型断言能让TypeScript不报错,编译顺利通过
内容的提问来源于stack exchange,提问作者Martijn
相关产品推荐
相关产品推荐

