Skip to content
← Back to rules

vitest/require-mock-type-parameters Correctness

作用

强制在 vi.fn() 上使用类型参数,并可选择性地对 vi.importActual()vi.importMock() 也进行检查。

默认情况下,只检查 vi.fn()。将 checkImportFunctions 设置为 true,也会检查 vi.importActual()vi.importMock()

为什么这不好?

如果没有显式的类型参数,vi.fn() 会创建一个类型为 (...args: any[]) => any 的 mock。 这会禁用 mock 与真实实现之间的类型检查,可能导致两个问题:

  • 测试由于错误的 mock 使用而失败,而它们本应通过
  • 或者更糟,测试通过了,但 mock 悄悄地偏离了实际运行时行为。

示例

以下是将此规则配置为 { "checkImportFunctions": false } 时的错误代码示例:

ts
import { vi } from "vitest";

test("foo", () => {
  const myMockedFn = vi.fn();
});

以下是将此规则配置为 { "checkImportFunctions": true } 时的错误代码示例:

ts
import { vi } from "vitest";

vi.mock("./example.js", async () => {
  const originalModule = await vi.importActual("./example.js");

  return { ...originalModule };
});
const fs = await vi.importMock("fs");

以下是将此规则配置为 { "checkImportFunctions": false } 时的正确代码示例:

ts
import { vi } from "vitest";

test("foo", () => {
  const myMockedFnOne = vi.fn<(arg1: string, arg2: boolean) => number>();
  const myMockedFnTwo = vi.fn<() => void>();
  const myMockedFnThree = vi.fn<any>();
});

以下是将此规则配置为 { "checkImportFunctions": true } 时的正确代码示例:

ts
import { vi } from "vitest";

vi.mock("./example.js", async () => {
  const originalModule = await vi.importActual<any>("./example.js");

  return { ...originalModule };
});
const fs = await vi.importMock<any>("fs");

配置

此规则接受一个包含以下属性的配置对象:

checkImportFunctions

type: boolean

default: false

同时要求为 importActualimportMock 提供类型参数。

如何使用

To enable this rule using the config file or in the CLI, you can use:

json
{
  "plugins": ["vitest"],
  "rules": {
    "vitest/require-mock-type-parameters": "error"
  }
}
ts
import { defineConfig } from "oxlint";

export default defineConfig({
  plugins: ["vitest"],
  rules: {
    "vitest/require-mock-type-parameters": "error",
  },
});
bash
oxlint --deny vitest/require-mock-type-parameters --vitest-plugin

版本

此规则是在 v1.58.0 中添加的。

参考