在Vitest中,如何断言console.log()已被调用?
在Vitest中捕获并分析控制台输出
和Jest的思路类似,Vitest提供了几种方式来捕获被测代码的控制台输出,下面是最常用的两种方案:
方案一:使用vi.spyOn(推荐)
vi.spyOn是Vitest官方推荐的mock方式,它可以创建一个"间谍"函数监听console方法的调用,并且能方便地恢复原方法,避免影响其他测试用例。
示例代码
假设被测函数如下:
// utils.js export function printGreeting(name) { console.log(`Hello, ${name}!`); }
对应的测试代码:
// utils.test.js import { describe, it, expect, vi } from 'vitest'; import { printGreeting } from './utils'; describe('printGreeting', () => { it('logs the correct greeting message', () => { // 创建console.log的间谍函数 const logSpy = vi.spyOn(console, 'log'); // 执行被测函数 printGreeting('Alice'); // 断言调用次数和参数 expect(logSpy).toHaveBeenCalledTimes(1); expect(logSpy).toHaveBeenCalledWith('Hello, Alice!'); // 恢复原console.log方法 logSpy.mockRestore(); }); });
方案二:直接替换console方法为vi.fn()
如果你习惯Jest中直接替换console.log的写法,在Vitest中也可以用vi.fn()实现,只需要记得测试结束后恢复原方法即可。
示例代码
it('captures log output with direct mock', () => { // 保存原console.log方法 const originalLog = console.log; // 替换为Vitest的mock函数 console.log = vi.fn(); printGreeting('Bob'); // 验证输出内容 expect(console.log).toHaveBeenCalledWith('Hello, Bob!'); // 恢复原方法 console.log = originalLog; });
扩展:捕获其他控制台输出
如果需要捕获console.warn、console.error等其他方法,只需要把上述示例中的log替换为对应的方法名即可,逻辑完全一致。
内容的提问来源于stack exchange,提问作者bbsimonbb
相关产品推荐
相关产品推荐

