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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 07:04:59